使用 Java Stream 查找 List 中具有最大值的元素

使用 java stream 查找 list 中具有最大值的元素

本文介绍了如何使用 Java Stream API 从 ArrayList<HashMap> 中找到具有最大 “Length” 值的 HashMap。文章首先建议使用自定义对象而非 HashMap 来存储数据,然后分别展示了查找单个最大元素和查找所有具有最大值的元素集合的两种方法,并提供了详细的代码示例。此外,还提供了使用三参数 Stream.collect() 方法的替代方案,避免创建中间 Map。

使用对象的力量

当处理结构化的数据时,应该优先考虑使用自定义对象而不是 HashMap。HashMap 适用于存储键值对,但当数据具有明确的属性和类型时,自定义对象能提供更好的类型安全性和可读性。例如,对于 {“Start”:”A”, “End”:”B”,”Length”:5} 这样的数据,可以创建一个如下的 Java 16 record:

public record Foo(String start, String end, int length) {}

使用 Foo 对象代替 HashMap,可以使代码更清晰、更易于维护。

查找单个最大元素

如果只需要找到一个具有最大 length 值的 Foo 对象,可以使用 Stream.max() 或 Collections.max() 方法。这两个方法都需要一个 Comparator 实例来比较对象。

立即学习“Java免费学习笔记(深入)”;

使用 Stream API

List foos = // 初始化列表Foo max = foos.stream()    .max(Comparator.comparingInt(Foo::length)) // 返回 Optional    .orElseThrow();

这段代码首先将 foos 列表转换为 Stream,然后使用 Comparator.comparingInt(Foo::length) 创建一个比较器,根据 length 属性进行比较。Stream.max() 方法返回一个 Optional 对象,因为列表中可能没有元素。使用 orElseThrow() 方法可以在列表为空时抛出异常。

使用 Collections.max()

List foos = // 初始化列表Foo max = Collections.max(foos, Comparator.comparingInt(Foo::length));

Collections.max() 方法直接在集合上查找最大元素,也需要一个 Comparator 实例。

查找所有具有最大值的元素

如果需要找到所有具有最大 length 值的 Foo 对象,可以使用 groupingBy() 方法将数据按 length 分组,然后找到具有最大键的条目。

List foos = // 初始化列表List max = foos.stream()    .collect(Collectors.groupingBy(Foo::length)) // Map<Integer, List>    .entrySet().stream()             // Stream<Map.Entry<Integer, List>>    .max(Map.Entry.comparingByKey()) // Optional<Map.Entry>    .map(Map.Entry::getValue)        // Optional<List>    .orElse(Collections.emptyList());

这段代码首先使用 Collectors.groupingBy(Foo::length) 将 foos 列表按 length 分组,生成一个 Map<Integer, List>,其中键是 length 值,值是具有相同 length 值的 Foo 对象列表。然后,将 Map 的条目转换为 Stream,并使用 Map.Entry.comparingByKey() 找到具有最大键的条目。最后,提取该条目的值,即具有最大 length 值的 Foo 对象列表。

使用三参数 Stream.collect() 方法

另一种方法是使用三参数版本的 Stream.collect() 方法,它可以避免创建中间 Map。

List foos = // 初始化列表List max = foos.stream()    .collect(        ArrayList::new,        (List l, Foo f) -> {            if (!l.isEmpty() && l.get(0).length()  {            if (l.get(0).length() < r.get(0).length()) l.clear();            if (l.isEmpty() || l.get(0).length() == r.get(0).length()) l.addAll(r);        }    );

这个方法使用一个 ArrayList 作为累加器,第一个参数 ArrayList::new 创建一个新的 ArrayList。第二个参数是一个 BiConsumer,它接受累加器和 Stream 中的元素,并根据元素的 length 值更新累加器。如果当前元素的 length 值大于累加器中已有元素的 length 值,则清空累加器并将当前元素添加到累加器中。如果当前元素的 length 值等于累加器中已有元素的 length 值,则将当前元素添加到累加器中。第三个参数是一个 BinaryOperator,它接受两个累加器,并将它们合并。如果第一个累加器中元素的 length 值小于第二个累加器中元素的 length 值,则清空第一个累加器并将第二个累加器中的元素添加到第一个累加器中。如果两个累加器中元素的 length 值相等,则将第二个累加器中的元素添加到第一个累加器中。

总结

本文介绍了如何使用 Java Stream API 从 ArrayList<HashMap> 中找到具有最大 “Length” 值的 HashMap。首先建议使用自定义对象代替 HashMap 来存储数据,然后分别展示了查找单个最大元素和查找所有具有最大值的元素集合的两种方法,并提供了详细的代码示例。此外,还提供了使用三参数 Stream.collect() 方法的替代方案,避免创建中间 Map。选择哪种方法取决于具体的需求和性能考虑。

以上就是使用 Java Stream 查找 List 中具有最大值的元素的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/100180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月20日 21:08:35
下一篇 2025年11月20日 21:33:03

相关推荐

  • 虚拟货币华为手机怎么交易?华为手机虚拟货币APP安装步骤

    %ignore_a_1%binance 欧易okx 火币HTX 大门Gate.io 部分华为手机由于系统环境的特殊性,安装应用的方式与常规安卓手机略有不同。本文将为您详细介绍在华为手机上安装和使用主流虚拟资产交易应用的两种主要方法,帮助您顺利完成设置。 一、方法一:通过华为应用市场(AppGalle…

    2025年12月9日 好文分享
    000
  • 交易中的“滑点”是什么?为什么我买入的价格和看到的不一样?

    %ignore_a_1%币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 币圈交易中的“滑点”,指的是您下单时的预期成交价格与实际成交价格之间的差异。这种现象在市场快速波动或流动性不足时尤其常见,导致您最终的买入或卖出成本发生变…

    2025年12月9日
    000
  • 以太坊生态应用:DApp世界的无限可能

    以太坊作为区块链技术的开创者之一,其生态系统正在以前所未有的速度扩张,而其中最引人注目的莫过于dapp(去中心化应用)的蓬勃发展。dapp不仅是区块链技术应用落地的核心体现,更是预示着一个由智能合约驱动、用户拥有数据主权的全新互联网时代的到来。它们摆脱了传统中心化平台的束缚,通过代码强制执行协议,确…

    好文分享 2025年12月9日
    000
  • Casper Network是什么?发展历程、CSPR 代币经济与未来展望介绍

    casper 结合高扩展性、合规性与可升级智能合约,推动机构级区块链与现实资产代币化的新世代发展。 Binance币安 欧易OKX ️ Huobi火币️ ‍ 什么是 Casper Network,它是如何运作的? Casper Network 是一条为实际商业应用而设计的第一层(Layer 1)区块…

    2025年12月9日
    000
  • 比特币信仰者(Maximalist):为何坚守比特币?

    在数字货币的浩瀚星海中,比特币(bitcoin)无疑是最璀璨的那颗星。它的诞生,不仅催生了区块链技术,更点燃了一场关于货币、权力与自由的深刻革命。然而,在这场革命中,有一群人显得尤为坚定,他们就是被称为“比特币信仰者”(bitcoin maximalist)的群体。他们坚信比特币是唯一的、最终的、无…

    好文分享 2025年12月9日
    000
  • 比特币官方网站进入 BTC登录网址2025版

    %ignore_a_1%币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 比特币官方网站进入 BTC登录网址2025版在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来比特币相关平台的访问方式与信息介绍,感兴趣的网友一起…

    2025年12月9日
    000
  • 比特币BTC官网 2025最新登录入口

    %ignore_a_1%币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 比特币BTC官网2025最新登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来比特币BTC官网2025最新登录入口,感兴趣的网友一起随小编…

    2025年12月9日
    000
  • BTC官方网站 比特币登录入口2025

    %ignore_a_1%币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: BTC官方网站比特币登录入口2025在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来BTC官方网站比特币登录入口2025,感兴趣的网友一起随小编…

    2025年12月9日
    000
  • 2025年第四季度山寨币投资指南:智能资金布局的五大领域

    随着2025年第四季度临近,山寨币市场再度吸引投资者关注。智能资金正在布局多个潜力板块,为交易者提供新的投资机会。本文将为新手和有经验的投资者解析五大山寨币投资领域及其潜在价值。 一、去中心化%ignore_a_1%(DeFi)项目 DeFi生态依然是智能资金关注重点。稳定币借贷、流动性挖 矿及去中…

    2025年12月9日
    000
  • 瑞波币官方网站登录链接 XRP2025年官网入口地址

    %ignore_a_1%币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 瑞波币官方网站登录链接 XRP2025年官网入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来瑞波币官方网站登录链接 XRP2025年官网…

    2025年12月9日
    000
  • 比特币价格追踪利器!2025年这10款实时行情APP备受推崇

    2025年最受推崇的%ignore_a_1%行情APP包括币安、欧易、火币、Gate.io、CoinGecko、CoinMarketCap、TradingView、KuCoin、Kraken和Delta,这些应用凭借实时数据、专业分析工具和多样化功能,满足从新手到专业投资者的行情追踪与资产管理需求。…

    2025年12月9日
    000
  • 12个10 月的计划 TGE 项目有哪些?一文汇总介绍

    目录 Monad ($MON) | 高性能的第 1 层区块链Enso(ENSO)| 跨链流动性协议Yei Finance(CLO)| Sei 网络上的货币市场Fleek ($FLK) | 轻松构建开放式网站和应用进程LAB ($LAB) | 多链交易终端Novastro ($XNL) | AI 驱动…

    2025年12月9日 好文分享
    000
  • 什么是Recall(RECALL)币?它是如何运作的?Recall运作方式、代币经济和路线图介绍

    目录 什么是Recall?Recall的主要特点Recall如何运作?$RECALL 关键指标$RECALL 用例$RECALL 空投$RECALL 列表Recall代币经济学和筹款代币经济学Recall路线图和团队路线图团队结论常见问题解答什么是Recall? Recall 的原生代币是什么? R…

    2025年12月9日 好文分享
    000
  • 2025年具有百倍上涨潜力的山寨币!100到250倍潜力的山寨币总结!

    Binance%ignore_a_1% 欧易OKX ️ Huobi火币️ 现在想找百倍潜力的山寨币,核心逻辑是找那些有真实进展、生态在扩张,但价格还没反应的项目。市场情绪起来时,这类币最容易爆发。下面这几个方向和具体标的,在2025年具备100到250倍的增长空间,关键看能不能拿住。 AI与计算类:…

    2025年12月9日
    000
  • 以太坊:智能合约平台

    以太坊(ethereum),这个名字在今天的区块链世界中无疑是熠熠生辉的存在。它不仅仅是一种加密货币,更是一个革命性的开放式智能合约平台。如果你曾听说过比特币是“数字黄金”,那么以太坊则被誉为“世界计算机”。它的核心创新在于超越了单纯的价值转移,允许开发者在其之上构建和运行去中心化应用(dapps)…

    好文分享 2025年12月9日
    000
  • OKX欧交易平台 (加密货币交易所) v6.141.0 官方安卓版

    OKX%ignore_a_1%交易平台v6.141.0官方安卓版是一款全球领先的数字资产交易应用,为用户提供安全、稳定且功能丰富的加密货币交易服务,涵盖现货、合约及金融产品等多元化投资选择。 OKX欧交易平台官网地址: OKX欧交易平台官方安卓版APP下载: 平台核心功能与优势 1、全面的资产覆盖,…

    2025年12月9日
    000
  • Token(代币)是什么?与Coin(币)有什么不同?

    “币”(Coin)和“代币”(Token)是两个经常被提及但又容易混淆的概念。尽管它们都以数字形式存在,并在区块链技术的基础上运行,但其底层技术、功能和创建方式却存在本质区别。简单来说,Coin是其自有独立区块链上的原生资产,如同一个国家的法定货币,是整个生态系统的基础燃料,用于激励网络参与者并支付…

    2025年12月9日
    000
  • 稳定币有哪几种?稳定币以太坊还有上涨空间吗?

    本文旨在厘清当前主流%ignore_a_1%的核心分类,并深入探讨在以太坊网络上发行的稳定币是否仍具备广阔的增长前景。通过了解不同稳定币的运作机制,可以更好地把握其在数字资产世界中的作用与潜力。 一、稳定币主流交易所推荐 1、币安binance: 2、欧意OK: 3、HTX火币:     4、Gat…

    2025年12月9日
    000
  • 一文读懂 Token

    Token在不同语境下有多种含义:在通用语境中,它可指代符号、凭证、安全设备或编程中的基本单位;在区块链领域,Token是基于现有区块链发行的数字资产,与拥有独立链的加密货币(Coin)不同,主要分为同质化(如ERC-20)和非同质化(如ERC-721)两类,并可用于功能、治理、证券或稳定价值等用途…

    2025年12月9日
    000
  • 怎么购买莱特币 LTC莱特币购买渠道推荐

    对于想要投资%ignore_a_1%(ltc)的新手用户来说,了解购买流程和渠道至关重要。本文将为您详细介绍从注册账户到安全存储的完整步骤。 建议在币安(Binance)或欧易OKX进行交易,这两大平台流动性高、安全性强,非常适合新手用户。 币安注册链接与下载地址: 欧易OKX注册与下载地址: 选择…

    2025年12月9日 好文分享
    000

发表回复

登录后才能评论
关注微信