讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

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

千辰小哥_3277

千辰小哥_3277

发布时间:2025-10-07 11:55:29

|

1029人浏览过

|

来源于php中文网

原创

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<String> s = Set.of("a", "b", "c");

        // 创建包含原始集合和新元素集合的流,然后扁平化并收集
        Set<String> t = Stream.of(s, Set.of("d", "e")) // Stream.of(Set<String>, Set<String>)
                            .flatMap(Set::stream)        // 将每个Set<String>转换为Stream<String>并扁平化
                            .collect(Collectors.toUnmodifiableSet()); // 收集为新的不可变Set

        System.out.println(t);
        // 预期输出:[d, e, c, b, a] (顺序可能不同,因为Set无序)
    }
}

代码解析:

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

解决方案二:合并元素流

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

JavaScript 开发专家
JavaScript 开发专家

掌握包含 ES6+、异步模式和 Node.js API 的现代 JavaScript。处理 Promise、事件循环和浏览器/Node 兼容性。在 JavaSc

下载

立即学习“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<String> s = Set.of("a", "b", "c");

        // 创建包含原始集合元素流和新元素流的流,然后扁平化并收集
        Set<String> t = Stream.of(s.stream(), Stream.of("d", "e")) // Stream.of(Stream<String>, Stream<String>)
                            .flatMap(Function.identity())        // 扁平化Stream<Stream<String>>为Stream<String>
                            .collect(Collectors.toUnmodifiableSet()); // 收集为新的不可变Set

        System.out.println(t);
        // 预期输出:[d, e, c, b, a] (顺序可能不同,因为Set无序)
    }
}

代码解析:

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

注意事项与总结

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

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7479

2023.08.02

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3680

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

594

2023.10.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

0

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

80

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn