Java的流库
Java的流库
从迭代到流的操作
将stream修改为parallelStream就可以让流库以并行方式来执行过滤和计数
long count = words.parallelStream().filter(w -> w.length() > 12).count();
流遵循了"做什么而非怎么做"的原则.
流与集合的差异
1. 流并不存储元素, 这些元素可能存储在底层的集合, 或者是按需生成的
2. 流的操作不会修改数据源. filter不会移除元素, 而是生成新的流, 其中不包含被过滤掉的元素
3. 流的操作是尽可能惰性执行的, 直至需要结果时才会执行.
流的创建
Stream<String> words = Stream.of(contentes.split("\\PL+"));
可以使用可变长参数
Arrays.Stream(array,from,to)
Stream.generate(()->"xx");
Stream.generate(Math.random);
filter, map 和 flatMap方法
抽取子流和组合流
其他流转换
简单约简
约简是一种终结操作, 将流约简为可以在程序中使用的非流值.
count max min
返回的类型是Optional<T>的值
.filter().findFirst(); 返回第一个满足条件的值
.filter().findAny(); 返回任意匹配值
.parallel().anyMatch(a->a.startWith("xxx)); 判断是否存在匹配
...allMatch()
...noneMatch()
Optional类型
Optional<T>对象是一种包装器对象, 要么包装了类型T的对象, 要么没有包装任何对象.
1. 获取Optional值
在值不存在的情况下会产生一个可替代物, 只有在值不存在的情况下才会使用这个值.
.orElse("");
.orGet(()->xxx);
.orElseThrow(XXXxeption::new);
2. 消费Optional值
ifPresent方法会接收一个函数, 如果可选值存在才会传递.
.ifPresent(v->xx);
.ifPresent(v->xxx.add());
.ifPresent(xxx::add);
.ifPresentOrElse(
v->xxxx,
()->xxx
);
3. 管道化Optional值
可以使用类似filter和map的方法
.map(xxx::xxx);
如果值存在则返回, 不存在则计算lambda表达式中的结果并返回
.or(()->xx);
4. 不适合使用Optional的方式
get()方法可能会抛出异常
类似orElseThrow()
5. 创建Optional值
Optional.of(xxx)
Optional.empty()
Optioanl.ofNullable(obj)会在obj不为null的情况下返回Optional.of(obj), 否则会返回Optional.empty()
6. 用flapMap构建Optional值的函数
7. 将Optional转换为流
收集结果
使用iterator, 产生用来访问元素的旧式风格的迭代器.
使用forEach方法, 以任意顺序遍历各个元素, 如果想按照流中的顺序处理, 需要调用forEachOrdered()
使用toArray获得数组, 需要传入类型, toArray(String[]::new)
使用collect(), 需要传入Collectors.toList()类似的产生的收集器
使用Collectors.summarizing()可以映射为数值
收集到映射表中
.collect(Collectors.toMap(XXX::getXX(), Function.identity(), (v1, v2 -> v1)));
群组和分区
.collect(Collectors.groupingBy(XXX::getXXx()))
.collect(Collectors.partitioningBy(断言函数)) 分成两类, true和其他
断言函数: 返回boolean的函数
下游收集器
约简操作
reduce方法用于从流中计算某个值
.stream.reduce(Integer::sum);

浙公网安备 33010602011771号