在警报声中学习

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);

基本类型流

并行流

posted @ 2023-02-28 10:30  颠三倒四不积极  阅读(22)  评论(0)    收藏  举报