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

2024-01-03

如何在以下代码中获取流或列表的最后一个元素?

Where data.careas is a List<CArea>:

CArea first = data.careas.stream()
                  .filter(c -> c.bbox.orientationHorizontal).findFirst().get();

CArea last = data.careas.stream()
                 .filter(c -> c.bbox.orientationHorizontal)
                 .collect(Collectors.toList()).; //how to?

正如你所看到的,获得第一个元素,具有一定的filter,并不难。

然而,在一行中获取最后一个元素是一件非常痛苦的事情:

  • 看来我无法直接从Stream。 (这只对有限流有意义)
  • 似乎你也无法得到类似的东西first() and last()来自List界面,这确实是一个痛苦。

我认为没有任何理由不提供first() and last()方法中的List接口,因为其中的元素是有序的,而且大小是已知的。

但根据原来的答案:如何获得有限的最后一个元素Stream?

就我个人而言,这是我能得到的最接近的:

int lastIndex = data.careas.stream()
        .filter(c -> c.bbox.orientationHorizontal)
        .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);

然而,它确实涉及使用indexOf在每个元素上,这很可能不是您通常想要的,因为它会损害性能。


可以使用该方法获取最后一个元素流::减少 http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-。以下清单包含一般情况的最小示例:

Stream<T> stream = ...; // sequential or parallel stream
Optional<T> last = stream.reduce((first, second) -> second);

此实现适用于所有人有序流 http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Ordering(包括从创建的流Lists http://docs.oracle.com/javase/8/docs/api/java/util/List.html). For 无序的 http://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#unordered--由于明显的原因,streams 未指定将返回哪个元素。

该实施适用于两者顺序的 and 并行流。乍一看这可能会令人惊讶,不幸的是文档没有明确说明。然而,这是流的一个重要特征,我试图澄清它:

  • 该方法的 Javadoc流::减少 http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-指出,它"is not被迫执行依次地".
  • Javadoc 还要求“累加器函数必须是联想性的, 互不干扰, 无国籍的组合两个值的函数",这显然是 lambda 表达式的情况(first, second) -> second.
  • Javadoc 的还原操作 http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Reduction状态:“流类有多种形式的一般归约操作,称为reduce() http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator- and 收集() http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.stream.Collector- [..]" and “正确构建的归约操作是本质上可并行,只要用于处理元素的函数是联想性的 http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Associativity and 无国籍的 http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#NonInterfering."

密切相关的文档收藏家 http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html更明确的是:“为了保证顺序的 and 并行执行生产同等结果,收集器函数必须满足恒等式和关联性 http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Associativity限制。”


回到最初的问题:以下代码存储对变量中最后一个元素的引用last如果流为空,则抛出异常。复杂度与流的长度成线性关系。

CArea last = data.careas
                 .stream()
                 .filter(c -> c.bbox.orientationHorizontal)
                 .reduce((first, second) -> second).get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在一行中获取 Stream/List 的最后一个元素 的相关文章

随机推荐

  • 如何在 YouCompleteMe 弹出菜单中使用 展开 UltiSnips 代码段?

    这个问题确实触动了我的神经 我两个都有你使我完整 https github com ycm core YouCompleteMe and 多功能剪 https github com sirver ultisnips安装在我的 vim 8 0
  • 为什么提交作业失败并显示“NoSuchMethodError: scala.runtime.VolatileObjectRef.zero()Lscala/runtime/VolatileObjectRef;”?

    我正在尝试提交 Spark 作业 它是这样开始的 import javax xml parsers SAXParser SAXParserFactory import org apache spark import org apache s
  • 如何在phpmyadmin中将分隔数据导入mysql

    这是使用中的数据示例 24701 37 279788 81 229023 WV BLUEFIELD MERCER 正如您所看到的 它是由双管道分隔的 phpmyadmin 要求我提供以下信息 Fields Terminated By Fie
  • C中如何使用函数uname

    我应该编写一个函数来获取有关系统的一些信息 最重要的信息是体系结构 我找到了这个功能uname可以使用的包括系统 utsname h 好吧 虽然我用谷歌搜索并阅读了文档 但我找不到该函数的任何示例 而且我不明白如何使用 uname 任何人都
  • 我如何在cmd行中运行maven项目

    我编写 Maven 项目并在 Eclipse 中运行它 但我想使用命令行运行 Maven 项目 所以我写 java jar Dapple awt UIElement true target myproject 1 0 SNAPSHOT ja
  • 使用curl --data测试REST路由,返回404

    我正在尝试 MEAN 堆栈教程 并且我位于 测试初始路由 https thinkster io mean stack tutorial opening rest routes testing the initial routes 步骤 我们
  • Apache CXF 2.2.7 Spring 3 Web 服务解组错误:意外元素

    我使用 Apache CXF 2 2 7 和 Spring 3 开发了一个简单的 Web 服务应用程序 并将其作为 WAR 文件部署到 Tomcat 上 但收到以下错误消息 2010 年 4 月 12 日 15 56 12 org apac
  • 函数代理 .toString() 错误

    我试图在函数代理上调用 toString 简单地创建一个函数代理并调用 toString 会导致 TypeError Function prototype toString is not generic 将 toString 设置为返回原始
  • 如何取消特定用户的会话?

    我有一个这样的会议 SESSION login 当它等于1 这意味着使用已登录到我的网站 if SESSION login 1 You are logged else login register 我还有另一个包含用户 ID 的会话 像这样
  • Moqui 部署到 Elastic Beanstalk Tomcat 实例上的 AWS

    背景 我们已经使用 Java 环境在 Elastic Beanstalk 上运行带有嵌入式 Jetty 服务器的 Moqui 2 0 大约一年了 出于安全原因 我们让应用程序与 Postgres 数据库一起在私有子网中运行 并通过 VPN
  • Mosquitto套接字读取错误Arduino客户端

    我刚刚从 Github 下载了最新的 Arduino 库代码 它破坏了我的 MQTT 客户端程序 我在 Arduino 上使用 PubSubClient 1 91 在 Mac OSX 上使用 Mosquitto 1 1 2 Build 20
  • data.table 1.8.x Mean() 函数自动删除 NA?

    今天我发现我的程序中存在一个错误 原因是data table自动删除NA for mean 例如 gt a lt data table a c NA NA FALSE FALSE b c 1 1 2 2 gt a gt a list mea
  • 监听短信删除android

    我正在寻找用户从收件箱中删除短信的侦听器 Android 中用于删除短信的任何侦听器 https stackoverflow com questions 5025372 any listener for delete sms in andr
  • 经典 ADO.NET 还在使用吗?

    经典的 ADO NET 是否仍然广泛使用并被许多开发人员用于插入 读取数据等 尽管我们现在有 LINQ 和 EF 是的 在某些情况下仍然使用它 在我的日常工作中 我们有几个使用 SQL 大容量复制的情况 这需要良好的连接和命令 此外 SQL
  • 有没有办法刷新 POSIX 套接字?

    是否有一个标准调用可以将 POSIX 套接字的发送端一直刷新到远程端 或者是否需要将其作为用户级协议的一部分来实现 我查看了常见的标题 但找不到任何东西 设置 TCP NODELAY 然后将其重置回来怎么样 也许可以在发送重要数据之前或完成
  • 使用未知分隔符进行 Unix 排序(最后一列)

    我的数据如下所示 Adelaide Crows 5 2 3 0 450 455 460 67 8 Essendon 5 5 0 0 622 352 955 88 20 Fremantle 5 3 2 0 439 428 598 50 12
  • 使用 ffmpeg 添加不透明度叠加

    我的 ffmpeg 有问题 我尝试在视频上添加 png 文件 我发现如何添加 只是我希望这个 png 文件有一些不透明度 我尝试了这条线 ffmpeg n i video mp4 i logo png filter complex sets
  • 对有连字符的字母数字数据进行排序

    我的工作簿中有两张表 每张表都有自己的电子邮件地址列以及其他数据 我将引用 Sheet1 中的 Column1 和 Sheet2 中的 Column2 其中只有 Column1 可能列出了重复的电子邮件地址 我需要确定 Column1 中的
  • Oracle sql 中“%Type”是什么意思?

    我第一次体验 Oracle 和 TOAD 我知道 SSMS 我在更新过程中的输入参数旁边遇到了这个 Type 但我不知道它是什么或意味着什么 我在 Google 上找到了与 Rowtype 相关的链接 是相同的东西还是完全不同的东西 如果这
  • 在一行中获取 Stream/List 的最后一个元素

    如何在以下代码中获取流或列表的最后一个元素 Where data careas is a List