前言
老子以前还以为stream就是说的inputStream, outputStream之类的东西呢,后来才知道是要进行流是计算。
处理框架
对于stream的操作,框架是比较简单的,就是建立流,处理流,获取结果。这话听起来和打开冰箱,把大象塞进去,关上冰箱门这么简单一样。
建立流
为了能够进行流处理,必须先建立流。常见的建立流的场景包括:
- 从集合建立
Collections.stream()
- 从数组中建立
Steam.of()
- 使用生成器无中生有的生成:
Stream.generate()
- 空的stream :
Stream.empty()
流操作
流操作也称之为流转换,就是把一个流转成另一个流。比如我们常见的map, filter之类。
flatmap比较高级,就是处理流的时候,生成的流中的每个元素又是一个流。我们可以使用flatmap将这其中的每个元素的又再次地展开,大概的伪代码应该是
FLAT_xxxx : get-one-item() {
if (current_stream is null) {
current_stream = get-one-item(up_stream);
}
while (not end-of-stream (current-stream)) {
var retval = get_one_item(current-stream);
if (end-of-stream(retval)) {
current-stream = get-one-item(upstream);
} else {
return retval;
}
}
return END-OF-STREAM;
作为比较,map依赖的大概样子是这样:
xxxx : get-one-item() {
return get_one_item(up-stream);
}
其它也很常见的流操作包括了
- 提取子流
- 组合流
获取结果
最终问题获取结果,获取的结果也可以是一个流,也可以是对流进行聚合,比如reduce,或者sum, max, min, average类型的操作。
Optional类型
在对stream进行操作时,对于存在性(有值或者没有值)的返回,我们可以返回一个值,或者没有找到时返回一个替代值,替代值可以是空值,也可以是任何其它的东西。Optional就是为了简化这个操作,Optional也可以再次被当作是一个stream,它要么产生一个实际的元素,要么啥也没有。
Optional的典型操作
- 获取里面的值,
Optional.get()
- 直接进行操作,
Optinal.ifPresent()
- 拿它来流使,
Optional.map()
- 值与替代值的获取,
Optional.orElse(), Optional.orElseGet(), Optional.orElseThrow()
获取结果的操作说简单非常简单,说复杂是因为java把个collection的概念做得复杂庞大。所以简单分类就是:
- 聚合类操作,直接返回一个值或者几个值,这包括了reduce,summarizing(Int | Long | Double)之类;
- 放到一个数组中
- 放到一个集合中,这里面的变数最多。
网友评论