前面说了半天都是关于流的生成和中间步骤,最后我们总要获得一个结果的,这个结果会是一个具体的东西,而不是一个流。这个过程就叫 reductions

reduction 的结果总会包在 The Optional Type 中返回,因为有可能会是 null 感觉有的老哥代码习惯不好,让开发者擦屁股,也不见得别的地方都有屁股可擦啊

findFirst & findAny

any/all/noneMatch

reduce

除了有方法在做 reduction 效果的事,还有直接 reduce 的方法。直接看例子最懂了

List<Integer> values = ...;
Optional<Integer> sum = values.stream().reduce((x, y) -> x + y);
// 或者用 Integer::sum 来代替

如果想要诗情画意地去理解,可以采用 “v1 op v2 op v3 op …”

也正因如此,不能用减法,因为他没有结合律

identity

Integer sum = values.stream().reduce(0, (x, y) -> x + y);

给他一个初始值,他能加在最开头,丢掉 Optional 的包袱

==然而书上说,少用 reduce,通常都可以转化为 primitive stream==