对于集合常用的方法就是对数据进行过滤和筛选,流也提供了多个方法让我们方便的选择数据。
有的方法我们之前也使用过,直接上代码:
先构建测试数据:
//筛选
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配合使用,就能实现分页的效果。