在一行中获取 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 的最后一个元素 的相关文章

  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • 解压 R 数据框中的列表

    我有一个dataframe其中一个字段包含不同长度的列表 我想将该字段中列表的每个元素提取到其自己的字段中 以便我可以将结果收集到一个很长的字段中dataframe每个列表元素都有一个 id 这是一个例子dataframe dat lt s

随机推荐

  • 如何在 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