-
概述
数据渠道、管道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算
即一组用来处理数组,集合的API。
-
特点
Stream 不是数据结构,没有内部存储,自己不会存储元素。Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
不支持索引访问。
延迟计算
支持并行
很容易生成数据或集合
支持过滤,查找,转换,汇总,聚合等操作。
-
创建流的方式
//数组 Stream.of
String[] strings = {"a","b","c","d"};
Stream<String> stream1 = Stream.of(strings);
//集合
List<String> strings2 = Arrays.asList(strings);
Stream<String> stream2 = strings2.stream();
//Stream.generate创建
//创建无限流,里面全是1,通过limit 限制条数5条
Stream<Integer> generate = Stream.generate(()->1);
generate.limit(5).forEach(x -> System.out.println(x));
//Stream.iterate来创建
//创建一个无限流,里面的数据有序,从2开始步长为3
Stream<Integer> iterate = Stream.iterate(2, x ->x+3);
iterate.limit(5).forEach(x -> System.out.println(x));
//通过已有Api
String string = "abc";
IntStream chars = string.chars();
chars.forEach(x -> System.out.println(x));
- 转换算子
常用:
limit : 取集合中的前几条数据
fiter : 对元素进行过滤筛选,不符合条件就不要了
distinct : 去重
skip : 跳过多少元素
map : 更改数据 。 在遍历集合的过程中,对元素进行操作,比如判断集合元素是否是a 返回boolean
sorted : 排序
··注意只用此算子是不会真正进行计算的,只有后边调用动作算子才会真正计算。
-
动作算子
循环 forEach计算 min、max、count、average
匹配 anyMatch、allMatch、noneMatch、findFirst、findAny
汇聚 reduce
收集器 collect