可以使用Stream ::
reduce方法获取最后一个元素。下面的清单包含一般情况的最小示例:
Stream<T> stream = ...; // sequential or parallel streamOptional<T> last = stream.reduce((first, second) -> second);
此实现适用于所有有序流(包括从List创建的流)。对于无序流,由于显而易见的原因,未指定将返回哪个元素。
该实现适用于 顺序 流 和 并行流
。乍一看这可能令人惊讶,但是不幸的是文档没有明确说明。但是,它是流的重要功能,我尝试对其进行澄清:
- 方法Stream :: reduce的Javadoc 指出,它 “ 不受 顺序 执行的约束”。
- Javadoc还要求 “累加器函数必须是 用于组合两个值的 关联 , 无干扰 , 无状态 函数”,这显然是lambda表达式的情况
(first, second) -> second
。 - 用于归约运算的Javadoc 指出: “流类具有多种形式的常规归约运算,分别称为 reduce()和collect() [..]”_和 “ 只要函数具有适当的构造,reduce运算就 具有固有的可并行 性。 )用于处理元素是关联的和无状态的。”_
与密切相关的收集器的文档更加明确:
“为确保 顺序 和 并行执行 产生 相等的结果
,收集器功能必须满足标识和关联性约束。”
回到原始问题:以下代码将对最后一个元素的引用存储在变量中
last,如果流为空,则引发异常。复杂度在流的长度上是线性的。
CArea last = data.careas .stream() .filter(c -> c.bbox.orientationHorizontal) .reduce((first, second) -> second).get();



