collectingAndThen方法足够高效吗?

2023-12-01

我最近开始使用collectingAndThen,发现与我用来执行类似任务的其他编码程序相比,它花费的时间有点长。

这是我的代码:

        System.out.println("CollectingAndThen");
        Long t = System.currentTimeMillis();
        String personWithMaxAge = persons.stream()
                                        .collect(Collectors.collectingAndThen(
                                                                Collectors.maxBy(Comparator.comparing(Person::getAge)),
                                                                (Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
                                                ));


        System.out.println("personWithMaxAge - "+personWithMaxAge + " time taken = "+(System.currentTimeMillis() - t));
        Long t2 = System.currentTimeMillis();
        String personWithMaxAge2 = persons.stream().sorted(Comparator.comparing(Person::getAge).reversed())
                                                    .findFirst().get().name;
        System.out.println("personWithMaxAge2 : "+personWithMaxAge2+ " time taken = "+(System.currentTimeMillis() - t2));

这是输出:

CollectingAndThen
personWithMaxAge - Peter time taken = 17
personWithMaxAge2 : Peter time taken = 1

这表明 CollectionAndThen 相对而言花费了更长的时间。

所以我的问题是 - 我应该继续收集AndThen还是还有其他建议?


collectingAndThen添加仅在集合末尾执行的单个操作。

So

String personWithMaxAge = persons.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.maxBy(Comparator.comparing(Person::getAge)),
        (Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
    ));

Optional<Person> p = persons.stream()
    .collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
String personWithMaxAge = p.isPresent() ? p.get().getName() : "none";

当您使用生成的收集器作为另一个收集器的输入时,例如,在收集器中指定操作的实际优势就会显现出来。groupingBy(f1, collectingAndThen(collector, f2)).

由于这是最后仅执行一次的简单操作,因此不会对性能产生影响。此外,不太可能sorted基于解决方案比maxBy对任何重要输入的操作。

您只是使用了一个损坏的基准,违反了“中列出的几条规则”如何用 Java 编写正确的微基准测试?”。最值得注意的是,您正在测量 Stream 框架第一次使用的初始初始化开销。只需交换两个操作的顺序就会得到完全不同的结果。

不过,没有必要使操作变得不必要地复杂。如前所述,镜像现有 Stream 操作的收集器的优点是它们可以与其他收集器组合。如果不需要这样的组合,只需使用直接代码

String personWithMaxAge = persons.stream()
    .max(Comparator.comparing(Person::getAge))
    .map(Person::getName).orElse("none");

比 Collector 使用更简单,比 Collector 更高效sorted基于解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

collectingAndThen方法足够高效吗? 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 如何在 C# 中将 System.Decimal 位转换为字符串?

    我希望能够从System Decimalvalue 然后将其转换为该值的字符串表示形式 就像Decimal ToString 可以 但我很难想出算法 所以我有这样的事情 decimal d 1403 45433M int nDecimalB
  • SAP JBOSS 的 jar 问题

    我正在尝试使用 ABAP 函数调用将我的 J2EE 应用程序与 SAP 软件连接起来 当我在 Eclipse 中使用热编码值将其作为单个类运行时 它工作得很好 当我尝试在 JBoss 服务器中运行它时 我从前端获取一些值并将其传递给我的 J
  • 如何将数字传递给 .hideRow()?

    我从以下位置得到了以下脚本 Mike Grace 的网站 Deletes rows in the active spreadsheet that contain Yes in column A function readRows var s
  • 如何在 Windows 版 Git 客户端中对 TFS 服务器进行身份验证?

    我们在公司域上设置了 TFS 2017 服务器 我想使用 Windows CMD 行的 Git 从该 TFS 服务器上的存储库推送和提取代码 我已将必要的证书添加到本地商店 以便通过 SSL 障碍 但现在当我尝试将远程存储库克隆到我的域加入
  • 圆形 UIButton

    我想知道是否可以绘制圆形 UIButton 不是圆角矩形 当我在自定义类型的 UIButton 中添加圆形图像时 它看起来像一个圆形按钮 但在单击按钮时 按钮的边界变得可见 因此它看起来像一个方形按钮 然后当单击结束时 它又看起来像一个圆形
  • Selenium 代理服务器参数 - 未知错误:net::ERR_TUNNEL_CONNECTION_FAILED

    希望你一切都好 我在尝试设置 chrome webdriver 时遇到了一些问题 我正在尝试更改网络驱动程序的参数以轮换用户代理和 IP 我将其用于抓取目的并且不想获得具有相同 IP 和 UA 的位置 当我通过 UA 参数时 一切正常 但是
  • 如何使div可拖动

    如何使元素可以在两个 div 之间拖动 这似乎是可拖动的应该做的事情 但我无法使用我拥有的代码 在这个 jsfiddle 中 我有两个带有可拖动元素的 div 我想让一个元素从第一个 div 转到第二个 div 许多网站上都必须存在该功能
  • jQuery DOM 对象的 x y 文档坐标

    我需要获取 DOM 元素的 X Y 坐标 相对于文档的顶部 左侧 我找不到任何可以为我提供这些的插件或 jQuery 属性或方法 我可以获得 DOM 元素的顶部和左侧 但这可以相对于其当前容器 父级或文档 你可以使用方面插件 已弃用 包含在
  • React Native {NativeModules} 未在 M1/Silicon mac 上导入 - 返回空对象 {}

    我试图在一个开发的项目中创建一个 React native 本机模块 BankedSdk M1MacBook 但是 任何初始化模块的尝试都会返回一个空对象 这是适用于我的示例 2020 存储库intel机器 https github com
  • Java 中的 PHP strtotime() ?

    我正在寻找一种简单的方法来从用户可能输入的任何类型的时间输入生成MySQL DATETIME PHP 的 strtotime 函数使这一切变得简单 它可以执行以下操作 strtotime 2004 02 12T15 19 21 00 00
  • Oracle:将字段标准化为 CSV 字符串

    我有一些一对多标准化数据 如下所示 a x a y a z b i b j b k 什么查询将返回数据 使得 多 端表示为 CSV 字符串 a x y z b i j k Mark 如果您使用的是版本 11gR2 而谁不是 那么您可以使用
  • 在VBA中重复随机变量

    如何使用 randomize 和 rnd 来获取随机变量的重复列表 通过重复列表 我的意思是 如果您运行循环来获取 10 个随机数 则列表中的每个随机数都将是唯一的 此外 如果再次运行该序列 您将获得与之前相同的 10 个随机数 来自微软自
  • Python 自定义比较器如何工作?

    我有以下 Python 字典 2 3 4 5 3 1 0 0 0 1 4 1 10 1 2 3 现在我想根据字典值的值之和对它们进行排序 因此对于第一个键 值之和为 3 4 5 12 我编写了以下代码来完成这项工作 def myCompar
  • Qt:制作不同颜色的堆叠条形图[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试在 Qt 中制作一个时间线 其中不同的颜色代表不同的任务 最终 它应该看起来有点像这样 但只有一行 现在有人知道如何在不安装额外库的情况下仅使用 QPaint 来做到这一点
  • Matplotlib:使用 twinx 叠加时箱线图和条形图会发生变化

    当我创建条形图并使用 twin x 覆盖条形图时 与条形相比 框看起来向右移动了一位 这个问题之前已经被识别过 Python pandas 绘制如果孪生两个 y 轴则移动 x 轴 但该解决方案似乎不再有效 我使用的是Matplotlib 3
  • ““void (exeCallback::*)(int)”类型的值不能分配给“void (*)(int)”类型的实体”[重复]

    这个问题在这里已经有答案了 可能的重复 禁用 错误的函数转换 警告 我试图让我的大脑围绕 C 函数指针 为了保持我的学习经验基础 我创建了一个测试函数指针示例 最终 我想通过引用传递所有就绪的实例化对象 以便我可以回调该对象的方法 然而 为
  • 使用 AWK/Grep/Bash 从 HTML 中提取数据

    我正在尝试编写一个 Bash 脚本来从 HTML 页面中提取结果 我用Curl实现了获取页面内容 但下一步是解析输出 这是有问题的 该页面有趣的内容如下所示 div class result div class item div class
  • 如何修复使用 zxing 2.1 生成的不清晰的二维码图像?

    我使用zxing 2 1库生成了二维码图像 但图像非常模糊且不清晰 我可能哪里出错了 生成发生在较低级别 然后根据宽度和高度请求进行缩放 您可以请求生成更高的宽度和高度 ZXing 在查看器中公开了您可以设置的 BarcodeOptions
  • MySQL 按两个值排序

    简而言之 我有一个游戏 它的计分板显示了玩家最后的分数 他们花了多长时间才达到这个分数 我需要对 MySQL 结果进行排序 以便最快时间的最高分数排在第一位 最慢时间的最低分数排在最后 并且两者之间的所有内容都以相同的方式排名 但我不知道该
  • collectingAndThen方法足够高效吗?

    我最近开始使用collectingAndThen 发现与我用来执行类似任务的其他编码程序相比 它花费的时间有点长 这是我的代码 System out println CollectingAndThen Long t System curre