并行流处理比多线程更加方便的写法,且线程安全
private List<Person> getListPerson() {
List<Person> strList = new ArrayList<Person>();
for (int i = 0; i < 1000; i++) {
strList.add(new Person("aa" + i, i));
}
return strList;
}
/**
* 有返回 的接口
* 将List<Person> -> List<Student>
*/
@Test
public void mapTest() {
Instant start = Instant.now();
List<Person> listPerson = getListPerson();
// 根据源码,第一个为参数类型,第二个为返回对象类型
Function<Person, Student> mapper = p ->{
// do something
try {
Thread.sleep(2);
} catch (Exception e) {
e.printStackTrace();
}
Student stu = new Student(p.getName(), p.getAge());
return stu;
};
List<Student> rs = listPerson.parallelStream().map(mapper).collect(Collectors.toList());
System.out.println(rs.size());
Instant end = Instant.now();
System.out.println("耗时为:" + Duration.between(start, end).toMillis());
}
/**普通写法,,当大量数据操作时,才能体现性能更高
* 也就是 do something 耗时比较长
* @throws InterruptedException
*/
@Test
public void change() throws InterruptedException {
Instant start = Instant.now();
List<Person> listPerson = getListPerson();
List<Student> rs = new ArrayList<>(listPerson.size());
for (Person person : listPerson) {
// do something
Thread.sleep(2);
rs.add(new Student(person.getName(), person.getAge()));
}
System.out.println(rs.size());
Instant end = Instant.now();
System.out.println("耗时为:" + Duration.between(start, end).toMillis());
}
/**
* 无需返回
* 将List<Person> 中的人名都加上 sir 串
*/
@Test
public void peekTest() {
Instant start = Instant.now();
List<Person> listPerson = getListPerson();
Consumer<Person> action = p->{
p.setName(p.getName() + "sir");
};
listPerson.parallelStream().peek(action).count();
System.out.println(listPerson);
Instant end = Instant.now();
System.out.println("耗时为:" + Duration.between(start, end).toMillis());
}
public class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name= name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name;
}
}
public class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name= name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name;
}
}