可以使用Stream :: reduce方法获取最后一个元素。下面的清单包含一般情况的最小示例:
Stream<T> stream = ...; // sequential or parallel stream
Optional<T> last = stream.reduce((first, second) -> second);
此实现适用于所有有序流(包括从List创建的流)。对于无序流,由于显而易见的原因,未指定将返回哪个元素。
该实现适用于 和 。乍一看这可能令人惊讶,但是不幸的是文档没有明确说明。但是,它是流的重要功能,我尝试对其进行澄清:
与密切相关的收集器的文档更加明确:“为确保 和 产生 ,收集器功能必须满足标识和关联性约束。”
回到原始问题:以下代码将对最后一个元素的引用存储在变量中last
,如果流为空,则引发异常。复杂度在流的长度上是线性的。
CArea last = data.careas
.stream()
.filter(c -> c.b@R_55_2419@.orientationHorizontal)
.reduce((first, second) -> second).get();