Java中从现有不可变集合创建并扩展新不可变集合的指南

Java中从现有不可变集合创建并扩展新不可变集合的指南

本文旨在解决如何将一个已有的不可变 Set 与额外数据合并,生成一个新的不可变 Set,同时避免类型混淆的问题。通过深入探讨 Java Stream API 中的 flatMap 操作符,文章提供了两种高效且类型安全的方法,演示了如何将多个集合或元素流扁平化,并最终使用 Collectors.toUnmodifiableSet() 构建出符合预期的新不可变集合。

java 编程中,处理不可变集合(immutable set)是常见的需求,尤其是在函数式编程范式中,它有助于提升代码的健壮性和可预测性。当我们需要基于一个已有的不可变 set,并添加一些新的元素来创建一个全新的不可变 set 时,直接使用 set.of() 方法可能会导致意想不到的结果。例如,尝试 set t = set.of(s, “d”) 会将 s 作为一个整体元素而不是其内部的元素进行处理,从而创建一个包含 set 和 string 混合类型的新 set,这通常不是我们所期望的扁平化集合。

为了解决这个问题,我们可以利用 Java 8 引入的 Stream API,特别是 flatMap 操作符,它能够将一个流中的每个元素转换为一个流,然后将这些新的流连接成一个单一的流。

解决方案一:合并集合流

这种方法的核心思想是将现有的不可变 Set 和包含新元素的 Set 都视为独立的集合,然后创建一个包含这些集合的流,再通过 flatMap 将它们扁平化为单个元素的流。

import java.util.Set;import java.util.stream.Collectors;import java.util.stream.Stream;public class ImmutableSetExtension {    public static void main(String[] args) {        // 原始不可变集合        Set s = Set.of("a", "b", "c");        // 创建包含原始集合和新元素集合的流,然后扁平化并收集        Set t = Stream.of(s, Set.of("d", "e")) // Stream.of(Set, Set)                            .flatMap(Set::stream)        // 将每个Set转换为Stream并扁平化                            .collect(Collectors.toUnmodifiableSet()); // 收集为新的不可变Set        System.out.println(t);        // 预期输出:[d, e, c, b, a] (顺序可能不同,因为Set无序)    }}

代码解析:

Set s = Set.of(“a”, “b”, “c”);:初始化一个包含 “a”, “b”, “c” 的不可变 Set。Stream.of(s, Set.of(“d”, “e”)):这里创建了一个 Stream<Set>,它包含了两个 Set 对象:s 和一个临时创建的 Set.of(“d”, “e”)。.flatMap(Set::stream):这是关键步骤。对于流中的每个 Set 对象(即 s 和 Set.of(“d”, “e”)),Set::stream 方法会将其转换为一个 Stream。flatMap 会将这些独立的 Stream 连接成一个单一的 Stream,其中包含了所有原始集合和新集合的元素。.collect(Collectors.toUnmodifiableSet()):最后,使用 Collectors.toUnmodifiableSet() 将扁平化后的元素流收集到一个新的不可变 Set 中。这个方法确保了返回的 Set 是不可修改的。

解决方案二:合并元素流

第二种方法更为直接,它创建了一个包含现有集合的元素流和新元素的流的流,然后通过 flatMap 进行扁平化。

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

import java.util.Set;import java.util.function.Function;import java.util.stream.Collectors;import java.util.stream.Stream;public class ImmutableSetExtensionAlternative {    public static void main(String[] args) {        // 原始不可变集合        Set s = Set.of("a", "b", "c");        // 创建包含原始集合元素流和新元素流的流,然后扁平化并收集        Set t = Stream.of(s.stream(), Stream.of("d", "e")) // Stream.of(Stream, Stream)                            .flatMap(Function.identity())        // 扁平化Stream<Stream>为Stream                            .collect(Collectors.toUnmodifiableSet()); // 收集为新的不可变Set        System.out.println(t);        // 预期输出:[d, e, c, b, a] (顺序可能不同,因为Set无序)    }}

代码解析:

Set s = Set.of(“a”, “b”, “c”);:同样初始化原始不可变 Set。Stream.of(s.stream(), Stream.of(“d”, “e”)):这里创建了一个 Stream<Stream>。第一个元素是 s 的元素流 (s.stream()),第二个元素是直接由新元素 “d” 和 “e” 构成的流 (Stream.of(“d”, “e”))。.flatMap(Function.identity()):Function.identity() 是一个返回其输入参数的函数。在这种情况下,flatMap 会接收一个 Stream,并直接将其作为结果流的一部分。由于我们已经有一个 Stream<Stream>,flatMap 将把内部的 Stream 提取出来并连接成一个单一的 Stream。.collect(Collectors.toUnmodifiableSet()):同样,将扁平化后的元素流收集到一个新的不可变 Set 中。

注意事项与总结

不可变性保证: 两种解决方案都通过 Collectors.toUnmodifiableSet() 确保了最终生成的 Set 是不可修改的。这意味着一旦创建,就不能添加、删除或修改其元素。类型安全: Stream API 的类型推断和泛型使用确保了在整个操作过程中,集合的元素类型 (String 在本例中) 始终保持一致,避免了 Set.of(s, “d”) 带来的类型混淆问题。元素顺序: Set 是一个无序集合,因此打印出的元素顺序可能与添加顺序不同,甚至在多次运行时也可能不同。如果需要保持顺序,应考虑使用 List 或 LinkedHashSet。性能考量: 对于少量元素的集合,Stream API 的开销可以忽略不计。对于大量元素的集合,Stream API 通常是高效的,因为它利用了惰性求值和并行化潜力。选择哪种方法: 两种方法在功能上是等价的。第一种方法可能在概念上更直观,因为它处理的是集合的流;第二种方法直接处理元素的流,可能在某些场景下显得更简洁。根据个人偏好和代码可读性选择即可。

通过上述方法,我们可以优雅且安全地从一个现有不可变 Set 中创建并扩展一个新的不可变 Set,这在处理需要保持数据完整性和避免副作用的场景中尤为有用。

以上就是Java中从现有不可变集合创建并扩展新不可变集合的指南的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 17:35:47
下一篇 2025年11月4日 17:40:31

相关推荐

  • btc交易平台哪些安全?正规比特币交易所软件前十名推荐

    在数字货币的世界里,比特币(BTC)无疑是最耀眼的明星。然而,想要参与这场数字盛宴,选择一个安全、正规的交易平台至关重要。一个可靠的平台不仅能保障您的资金安全,还能提供流畅的交易体验。面对市场上琳琅满目的交易所,如何才能慧眼识珠,找到最适合自己的那一个呢? 这份榜单为您精心挑选了2024年最受认可、…

    2025年12月8日 好文分享
    000
  • VVV在过去30天内恢复了一个月的低点,从一个月的低点中恢复了略有损失,现在正准备在每日图表上打破较低的损失。

    在4月反弹导致重大恢复后,vvv在高达5.34美元的高点后停止了购买压力,后来跌倒了。 卖方在上周末稍微恢复了价格,在过去30天内造成了巨大的损失,现在准备在每日图表上打破巨大的损失。 在4月反弹导致重大恢复后,VVV在高达5.34美元的高点后停止了购买压力,后来跌倒了。 这导致了上个月的广泛回答阶…

    2025年12月8日
    000
  • 令牌解锁的海啸即将粉碎加密货币空间

    在接下来的半年中,名副其实的令牌解锁将粉碎到加密货币空间中。 代币解锁的海啸将在未来半年中粉碎加密货币空间。 这些解锁将用于交易价值约130亿美元的新加密资产,他们将在最令人印象深刻(实际上是笨拙的人)中这样做。解锁不仅主要是按部门和月份集中的,而且在许多情况下,它们还集中在单个令牌上。这个不平衡的…

    2025年12月8日
    000
  • UNI继续领导分散的交易所

    尽管竞争激烈,但其一致的升级和强大的流动性池有助于保持相关性。 加密货币的价格每天可能会大幅上涨或下降,试图预测价格变动可能有风险。最好投资于您理解和相信的加密货币,并为损益的可能性做好准备。此外,重要的是要注意,加密货币是一种挥发性资产类别,任何预测价格变动的尝试都是投机性的。 加密货币的价格,尤…

    2025年12月8日
    000
  • CCISD儿童营养部宣布在四个地点的夏季喂养时间表

    ccisd儿童营养部门宣布了其今年在整个地区的四个不同地点的夏季喂养时间表。 对领导者的特殊 CCISD儿童营养部门宣布了其今年在整个地区的四个不同地点的夏季喂养时间表。 在这些站点中,这四个站点将在6月的六月养活家庭,并在7月份喂养一个家庭。该计划为18岁及以下儿童提供免费早餐和午餐,我们欢迎组织…

    2025年12月8日
    000
  • 现在购买的最好的加密货币:发现真实用例将帮助您找到隐藏的宝石

    加密市场正在再次加热,现在找到最好的加密货币是关于发现真实用例的。有些硬币由于生态系统不断增长和技术进步而脱颖而出。 加密市场正在再次加热,现在找到最好的加密货币是关于发现真实用例的。有些硬币由于生态系统不断增长和技术进步而脱颖而出。每个都提供了一个独特的价值,从强大的AI工具到燃烧速度的区块链和可…

    2025年12月8日
    000
  • Circle的IPO目标旨在成为数字货币的基础设施层

    usdc stablecoin背后的公司circle internet financial于周四(6月5日)在纽约证券交易所(nyse)首次亮相的公司,在股票交易所“ crcl”下首次亮相 周四,USDC Stablecoin背后的公司Circle Internet Financial在纽约证券交易…

    2025年12月8日
    000
  • 加密货币市场正在嗡嗡作响,有关Ruvi AI的最新里程碑的消息

    加密货币市场引起了ruvi ai最新里程碑的消息。在预售的第1阶段在weex交换上确保上市是一个大胆的举动 加密货币市场充满了Ruvi AI的消息,Ruvi AI是一个尖端的项目,它以其独特的区块链和人工智能融合了浪潮。作为其正在进行的预售的一部分,Ruvi AI在第1阶段获得了WEEX Excha…

    2025年12月8日
    000
  • UNILABS(UNIL):Cardano(ADA)2.0智能投资革命

    卡尔达诺曾经承诺在智能投资方面发生革命,但时代已经改变。 ada持有人现在观看新工具可提供更好的结果和更快的回报。 Cardano Price继续在所有时间范围内的压力下继续交易,交易员指出,自11月以来,加密货币正在遵循降落的渠道。 三月看到Ada Price短暂飙升至1.17美元,从模式的上边界…

    2025年12月8日
    000
  • AI云采矿现在是2025年最可靠的被动收入策略

    如今,随着加密货币市场的波动率不断增加,欺诈项目的流行率,澳大利亚的法律和受监管的云采矿应用程序正成为合理投资者的新最爱。 输入:您每天都“观看硬币上下”,而其他人则是“自动挖掘到帐户的硬币”。在2025年,加密货币世界的生态系统将会改变。 “谁首先赚钱”的情况不再存在,而是“可以找到稳定的采矿现金…

    2025年12月8日
    000
  • 随着Memecoin势头的回归,华尔街庞克在交付真正的实用程序时涌现

    fartcoin和bonk本周激增,引起了人们对memecoin行业的重新关注。华尔街在短短两周内将近90%提高了 FARTCOIN和BONK本周激增,再次加热了Memecoin行业。 随着Fartcoin在短短两周内上涨了近90%,而Bonk上涨了30%以上,交易者正在寻找下一个突破性模因象征,以…

    2025年12月8日
    000
  • 2025年的顶级加密资产:BlockDag(BDAG),DOGE,TRX和HYPE受到严重关注

    探索blockdag,dogecoin,tron和hyproliquid在2025年如何竞争成为顶级加密资产,而blockdag的0.0018 $ 0.0018 presale presale pres价格则带来了这一动力。 在不断发展的加密货币景观中,保持曲线的领先至关重要。当我们深入研究2025…

    2025年12月8日
    000
  • 随着新加坡高等法院拒绝其拟议的重组计划,Wazirx面临另一个挫折

    加密货币交易所wazirx面临着另一个重大挫折。新加坡高等法院最近驳回了该公司提议的重组计划。此举伤害了wazirx,因为该公司去年经历了重大的黑客攻击。 该公司在一份声明中分享了加密货币交易所Wazirx面临另一个重大挫折,因为新加坡高等法院拒绝了该公司提议的重组计划。 订阅我们的新闻通讯,以了解…

    2025年12月8日
    000
  • Cardano(ADA)价格预测处于压力下,可能降至0.45美元

    较弱的defi活动和看跌技术信号表明动量逐渐消失。同时,unilabs正在获得吸引力。作为ada硬币偶然,unilabs攀升了50% 由于一些分析师认为加密货币可能会在寻找支持之前,加密货币可能会降至0.45美元,Cardano的价格预测又重新成为焦点。 MACD的Defi活动和看跌技术信号表明,加…

    2025年12月8日
    000
  • 贝莱德可能逐渐将其重点从比特币转移到以太坊

    这一重大发展推动了看涨以太坊的价格预测。同时,零加速硬币喷射螺栓(jbolt)正在吸引加密鲸的注意。 资产管理巨头贝莱德(Blackrock)可能会逐渐将其重点从比特币转移到以太坊,这是最近引起加密货币市场的注意力的一项机构举动。这一重大发展推动了看涨以太坊的价格预测。 同时,加密鲸鱼将零加速硬币喷…

    2025年12月8日
    000
  • XRP的价格预测越来越看好

    在ripple在迪拜推出rlusd之后,xrp的价格预测越来越看好。该公司获得了迪拜金融服务管理局的批准。 在Ripple在迪拜推出RLUSD之后,XRP的价格预测越来越看好。该公司获得了迪拜金融服务管理局的批准。 这样,它成为中东正式认可的最早正式认可的Stablecoin发行人之一。这种提升为R…

    2025年12月8日
    000
  • 枫木金融在Chainlink的跨链互操作性方案(CCIP)的帮助下扩展到Solana。

    此举通过将maple强大的机构贷款基础设施与世界上最快,最液体的区块链之一相结合,从而为贷方,借款人和更大的defi生态系统打开了新的可能性。 Maple Finance已在Chainlink的跨链互操作性协议(CCIP)的支持下正式启动了Solana的贷款协议。 这种整合将枫树的强大机构贷款基础设…

    2025年12月8日
    000
  • DWF Labs推出了USD1 Stablecoin,供机构和零售商人

    下一代web3投资者和做市商dwf实验室宣布,usd1 stablecoin已在dwf液体市场上播出。林恩·奇亚(lynn chia)。 下一代Web3投资者和做市商DWF Labs宣布,USD1 Stablecoin已在DWF液体市场上播出。 它的引入意味着1000多个交易对手可以通过DWF的机构…

    2025年12月8日
    000
  • Fair将本机AI优化介绍给以Vodafone作为创始验证器的区块链基础架构。

    skale labs是无气隐形区块链网络skale背后的团队,今天宣布了其计划推出fair的计划,这是世界上第一个耐mev的第1层区块链。 加利福尼亚州旧金山,2025年6月5日,Chainwire skale labs是无气隐形区块链网络skale背后的团队,今天宣布了其计划推出fair的计划,这…

    2025年12月8日
    000
  • Doge价格预测2025:它可以镜像2021牛的运行吗

    x的加密技术分析师tarder tardigrade分析了对历史价格行动的总结价格的分析,这表明有可能发生重大上升趋势。 技术分析师Trader Tardigrade分享了对Doge价格的分析,并比较了历史价格行动,这表明可能会产生重大上升趋势。分析师强调了一种狗蛋白图表模式,该图案与2018年的圆…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信