特点:对集合中的数据进行各种各样的运算和操作 例如过滤 排序 映射
集合关心的是数据的存储;Stream流关注集合中存储数据的运算和操作
- 使用步骤:
- 单线程流:stream()
- 多线程流:parallelStream()
细节点
- 获取一个流对象:Stream<Student> stream = list.stream();(加工)
- stream.filter(s->s.getAge().forEach(s->sout(s)));//lambda表达式s是学生集合对象
- 如果不进行终止操作,流的处理则不会运行stream.filter(s->s.getAge().forEach(s->sout(s)))
- 此语句执行完成后,filter拿到了满足条件的流对象 ;filter依然是一个流对象
- 返回一个只有操作接口的一个新的对象.流对象不是数据
-
- Stream<Student> stream = list.stream();流拿到了所有的集合对象
-
流不改变数据源
常用的中间操作方法:
- 所有的中间操作都必须写终止操作;一旦进行终止操作后就不再返回流对象了
- filter(Predicate pre) pre是过滤的条件
- stream.sorted() 方法 用来对集合中的元素进行排序 需要实现compareable()方法才能使用
- stream.limit(int n):限定获取前n个元素
- skip(long n):跳过前n条 先跳过前n条再获取limit()
- distinct():用来对集合中的元素去重 根据hashcode 和equals方法判断是否相同;重写equals 和hashcode方法
- map(): 映射: 用来提取元素的部分信息;
- stream.filter(s->getAge()>=25).forEach(System.out::println);
- map()使用时需要传入一个function接口类型的参数
- stream.filter(s->s.getAge()>=25).map(s->s.getname()).forEach(System.out::println);
- map()操作之后;流中持有的元素的类型会发生变化变成了name的流
常用终止操作
- forEach(con ):遍历最终操作的结果
- allMatch(Predicate) 判断是否全部符合某一个指定条件 返回boolean
- anyMatch(Predicate)判断集合中至少有一个符合条件的元素
- count()获取集合中的元素个数
- max();min()获取集合中的最大最小值
- collect() 返回一个新的List集合 stream.collect(Collectors.)
- 将stream流的数据收录到一个List<students>集合中
- Collectors.averagingDouble 返回一个double
- Collectors.summingInt()
- Collectors.groupingBy()对学生分组
12.
13. 对大于60的学生收集,再分组 partitioningBy()