栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

单行获取Stream / List的最后一个元素

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单行获取Stream / List的最后一个元素

可以使用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();


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495914.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号