Java8之流式使用总结记录

 Java8的流式数据处理,方便了集合数据的抽取及计算,不用在写for循环的方式,同时结合Collectors各种方法,现写此文主要是为了记录,提醒自己,工作中,总是容易忘记这些好用的小方法。

  filter操作

  1.过滤偶数数据集合

List<Integer> nums = new ArrayList<>();

        for(int i =0;i<100;i++){
            nums.add(i);
        }


        // filter 操作 过滤偶数集合
        List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

        for (int i:evens) {
            System.out.println("i-->"+i);
        }

      // 过滤后数据去重
        evens = nums.stream()
                .filter(num -> num % 2 == 0).distinct()
                .collect(Collectors.toList());

        for (int i:evens) {
            System.out.println("i-->"+i);
        }

 

2、对于一个对象,根据对象某一属性进行筛选

   

// 初始化
        List<Student> students = new ArrayList<Student>() {
            {
                add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
                add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学"));
                add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
                add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学"));
                add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
                add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学"));
                add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
                add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学"));
                add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学"));
                add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
            }
        };

        // filter 操作
        List<Student> whuStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())).collect(Collectors.toList());

        for (Student stu: whuStudents) {
            System.out.println("stu--"+stu.getName());

        }

 

    只返回前2个数据

  whuStudents = students.stream().filter(student -> "土木工程".equals(student.getSchool())).limit(2).collect(Collectors.toList());

        for (Student stu: whuStudents) {
            System.out.println("stu--"+stu.getName());

        }

   对过滤后的结果进行排序,排序收输出

      List<Student> sortedCivilStudents = students.stream()
                .filter(student -> "土木工程".equals(student.getMajor())).sorted((s1, s2) -> s1.getAge() - s2.getAge())
                .limit(2)
                .collect(Collectors.toList());

        for (Student stu: sortedCivilStudents) {
            System.out.println("stu--"+stu.getName());

        }

 对过滤结果调过前2个

     List<Student> civilStudents = students.stream()
                .filter(student -> "土木工程".equals(student.getMajor()))
                .skip(2)
                .collect(Collectors.toList());

        for (Student stu: civilStudents) {
            System.out.println("stu--"+stu.getName());

        }

 

映射操作

对过滤后的结果进行映射收集

 List<String> names = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .map(Student::getName).collect(Collectors.toList());


        for (String name: names) {
            System.out.println("name--"+name);
        }

 

 规约计算总和

int totalAge = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .mapToInt(Student::getAge).sum();

 

查找操作

判断集合中条件判断

        boolean isAdult = students.stream().allMatch(student -> student.getAge() >= 18);

 

规约收集

收集得到Int类型数据的 一次性得到元素个数、总和、均值、最大值、最小值,类似的还有summarizingLong  summarizingDouble

IntSummaryStatistics statistics = students.stream().collect(Collectors.summarizingInt(Student::getAge));

 

分组

 Map<String, List<Student>> groups = students.stream().collect(Collectors.groupingBy(Student::getSchool));

        for(String key : groups.keySet()){
            System.out.println(key+"-->"+groups.get(key));
            System.out.println("*********************************");

        }

 

流式处理中的很多都适合采用 分而治之 的思想,从而在处理集合较大时,极大的提高代码的性能,java8的设计者也看到了这一点,所以提供了 并行流式处理。上面的例子中我们都是调用stream()方法来启动流式处理,java8还提供了parallelStream()来启动并行流式处理,parallelStream()本质上基于java7的Fork-Join框架实现,其默认的线程数为宿主机的内核数。

 

主要参考 https://www.cnblogs.com/yadongliang/p/9317982.html

 

 

 

 

 

 

 

 

 

 

 

// 初始化
List<Student> students = new ArrayList<Student>() {
{
add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学"));
add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学"));
add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学"));
add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学"));
add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学"));
add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
}
};

// filter 操作
List<Student> whuStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())).collect(Collectors.toList());

for (Student stu: whuStudents) {
System.out.println("stu--"+stu.getName());

}
posted @ 2021-01-15 11:32  阳光麦田的博客  阅读(257)  评论(0)    收藏  举报