并行流处理比多线程更加方便的写法,且线程安全
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; } }