java8 集合并行流处理

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

 

posted on 2018-11-23 16:52  钉子His  阅读(2898)  评论(0编辑  收藏  举报

导航