Java Lambda从入门到精通十二 流的使用–筛选

对于集合常用的方法就是对数据进行过滤和筛选,流也提供了多个方法让我们方便的选择数据。

有的方法我们之前也使用过,直接上代码:

先构建测试数据:

//筛选
        List<Student> list = new ArrayList<>();
        String[] names = {"小明","小华","小志","小东","小李","小张","小王","小周","小吴","小郑"};
        for(int i=0; i<10; i++) {
            Student student = Student.builder()
                    .name(names[i])
                    .age(12+i/5)
                    .no(i+1)
                    .math(85d+i).build();
            list.add(student);
        }

        //初始化数据
        System.out.println("======初始化数据:======");
        list.forEach(System.out::println);

1、过滤-filter

        //过滤filter
        long filter = list.stream().filter(x -> x.getName().equals("小华")).count();
        System.out.println("学生中名字叫【小华】的有几个人:"+filter);

输出结果:

学生中名字叫【小华】的有几个人:1

2、去重-distinct

        //去重distinct
        Stream<Integer> distinct = list.stream().map(Student::getAge).distinct();
        System.out.println("所有学生年龄去重:");
        distinct.forEach(x->System.out.print(x+"  "));
        System.out.println();

输出结果:

所有学生年龄去重:
12  13  

注意:distinct根据流所生成元素的hashCode和equals方法实现。

3、跳过-skip

        //跳过skip
        List<Student> skip = list.stream().skip(6).collect(Collectors.toList());
        System.out.println("跳过前6条数据,剩下的数据:");
        skip.forEach(System.out::println);

输出结果:

跳过前6条数据,剩下的数据:
Student(classId=null, no=7, name=小王, age=13, math=91.0, chinese=null, english=null, score=null)
Student(classId=null, no=8, name=小周, age=13, math=92.0, chinese=null, english=null, score=null)
Student(classId=null, no=9, name=小吴, age=13, math=93.0, chinese=null, english=null, score=null)
Student(classId=null, no=10, name=小郑, age=13, math=94.0, chinese=null, english=null, score=null)

4、截断-limit

        //截断limit
        List<Student> limit = list.stream().skip(6).limit(2).collect(Collectors.toList());
        System.out.println("获取7-8条数据:");
        limit.forEach(System.out::println);

输出结果:

获取7-8条数据:
Student(classId=null, no=7, name=小王, age=13, math=91.0, chinese=null, english=null, score=null)
Student(classId=null, no=8, name=小周, age=13, math=92.0, chinese=null, english=null, score=null)

注意:skip返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流

3和4的正确性,可以从输出结果的序号就可以看出来。

skip和limit配合使用,就能实现分页的效果。