在以往的开发中,如果要对一个集合进行一些个操作,我们就要对数据进行for循环遍历,如果需求复杂些,往往要进行多次遍历,性能很低,写代码也很头疼,现在有了Stream的引入,这一切都变得很简单。我们可以像写SQL查询数据库一样操作集合,排序、分组、聚合、筛选等等应有尽有
Stream把我们要操作的数据抽象为流,数据流在管道中流动,在流动的过程中我们可以进行一些操作,下面来学习下:
上图是学习过程中我们要用到的数据:
①生成流( 相当于写了一个select * from tb_****的SQL):
//创建流的两种方式:
Stream<Student> stream = list.stream();//创建串行流
Stream<Student> studentStream = list.parallelStream();//创建并行流
②筛选数据(相当于SQL中的where语句)
List<Student> collect = stream.filter(student -> student.getSnation().equals("壮族")).collect(Collectors.toList());
- Stream的filter方法就是对数据的过滤操作,指定我们只要这些学生中民族为壮族的学生信息
- Steam的collect方法就是将经过处理的数据流再次转换为集合(本例中我用的是ArrayList,其他的集合也一样)
③排序(相当于SQL中的order by)
List<Student> reverse = stream.sorted(Comparator.comparing(Student::getSid).reversed()).collect(Collectors.toList());
Stream的sorted方法就是对数据进行排序:
- 值类型数据排序(例如集合:List list =Arrays.asList(3, 2, 2, 3, 7, 3, 5)):
- list.sorted() 正序
- list.sorted(Comparator.reverseOrder()) 倒序
- 引用类型数据排序(如上面的学生ArrayList):
- stream.sorted(Comparator.comparing(Student::getSid)) 正序
- stream.sorted(Comparator.comparing(Student::getSid).reversed()) 倒序
④分页取数(相当于SQL的limilt)
List<Student> reverse = stream.limit(10).collect(Collectors.toList());
Stream的limit方法表示取几条操作
⑤分组(相当于SQL中的group by)
Stream的collect方法除了可以将由集合转化的流再次转换成集合,还可以对集合进行分组,就像SQL中的group by一样
⑥map遍历集合中的每个元素
- 值类型集合(如:strings = Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);)
strings.stream().map(string -> string.toUpperCase()).collect(Collectors.toList());
这行代码将会遍历集合strings中的每个元素,将他们中的每个字母都转成大写字母
- 引用类型集合(如本案例中的学生集合)
List<String> names = stream.map(Student::getSname).collect(Collectors.toList());
这行代码遍历了所有的学生信息,取出了所有学生的name组成一个集合
⑦count(相当于SQL中的count(*))
long count = stream.filter(student -> student.getSsex().equals("女")).count();
这行代码统计了女生有几个