集合进阶2
Java不可变集合、Stream流与方法引用深度解析
一、不可变集合(Immutable Collections)进阶指南
1.1 不可变集合核心特性
- 防御性编程:防止外部修改数据(如传递集合给第三方库时)
- 线程安全:天然支持多线程读操作
- 内存优化:JVM可进行深度优化(如字符串常量池机制)
1.2 创建方式对比
创建方式 | 适用场景 | JDK版本 |
---|---|---|
List.of() | 元素≤10的List | 9+ |
Set.of() | 元素唯一且≤10的Set | 9+ |
Map.ofEntries() | 键值对>10的Map | 9+ |
Collections.unmodifiableXxx() | 包装现有集合 | 1.2+ |
List.copyOf() | 基于现有集合创建不可变副本 | 10+ |
超过10个元素的Map创建示例:
Map<String, String> map = Map.ofEntries(entry("A", "1"), entry("B", "2"), // ... 更多条目
);
1.3 不可变集合的"伪修改"技巧
List<String> list = List.of("A", "B", "C");
List<String> newList = new ArrayList<>(list);
newList.add("D"); // ✅ 通过拷贝创建新可变集合
二、Stream流高阶操作
2.1 流式处理核心机制
流操作分类表
操作类型 | 方法示例 | 特性 |
---|---|---|
中间操作 | filter/map/sorted | 延迟执行,可链式调用 |
终结操作 | forEach/collect/count | 触发实际计算,流不可重用 |
2.2 并行流性能优化
List<Integer> numbers = ...;
// 并行处理(数据量>1万时效果显著)
long count = numbers.parallelStream().filter(n -> n % 2 == 0).count();
注意事项:
- 线程安全问题:避免修改源数据
- 资源消耗:合理控制并行度(
ForkJoinPool
配置)
2.3 高级收集器应用
// 分组统计
Map<Department, Long> deptCount = employees.stream().collect(Collectors.groupingBy(Employee::getDept, Collectors.counting()));// 分区操作(工资≥1万的划分)
Map<Boolean, List<Employee>> partition = employees.stream().collect(Collectors.partitioningBy(e -> e.getSalary() >= 10000));
三、方法引用黑魔法
3.1 方法引用分类表
类型 | 语法格式 | 示例 |
---|---|---|
静态方法引用 | 类名::静态方法 | Integer::parseInt |
实例方法引用 | 对象::实例方法 | str::length |
构造方法引用 | 类名::new | Student::new |
数组构造引用 | 类型[]::new | String[]::new |
超类方法引用 | super::方法名 | super::toString |
3.2 特殊场景解决方案
场景1:处理检查异常
list.stream().map(obj -> {try {return parseObject(obj);} catch (Exception e) {throw new RuntimeException(e);}});
场景2:链式方法引用
Function<String, Integer> parser = Integer::parseInt;
Function<Integer, String> formatter = Object::toString;// 组合使用
list.stream().map(parser.andThen(formatter));
3.3 方法引用VS Lambda
比较维度 | 方法引用 | Lambda表达式 |
---|---|---|
代码简洁度 | 更简洁(已有方法适配时) | 需要完整书写逻辑 |
可读性 | 需要了解被引用方法 | 逻辑直观可见 |
复用性 | 高(直接引用现有方法) | 低(需重复编写相似代码) |
四、实战案例解析
案例1:不可变集合防御性编程
public class ApiService {private static final Map<String, String> CONFIG = Map.of("timeout", "5000","retries", "3");public void processRequest(Request request) {Map<String, String> safeConfig = Map.copyOf(CONFIG);externalLib.process(safeConfig); // 防止外部修改}
}
案例2:Stream流处理CSV数据
List<String> lines = Files.readAllLines(Paths.get("data.csv"));List<Employee> employees = lines.stream().skip(1) // 跳过标题行.map(line -> line.split(",")).filter(arr -> arr.length == 4).map(arr -> new Employee(arr[0], Integer.parseInt(arr[1]), arr[2], Double.parseDouble(arr[3]))).collect(Collectors.toList());
五、高频面试题深度剖析
5.1 为什么Stream流不能复用?
- 流管道机制:每个流对应一个数据源快照
- 状态管理:中间操作会修改流状态
- 解决方案:通过Supplier包装流创建逻辑
Supplier<Stream<String>> streamSupplier = () -> list.stream(); streamSupplier.get().forEach(...); streamSupplier.get().count(...);
5.2 方法引用底层实现原理
- invokedynamic指令:JVM动态调用机制
- Lambda表达式的语法糖:编译时生成私有静态方法
- 性能对比:与直接调用无显著差异(JIT优化后)
六、总结与进阶建议
技术选型指南
场景 | 推荐方案 |
---|---|
只读数据共享 | 不可变集合 |
复杂数据转换 | Stream链式操作 |
代码简洁性要求高 | 方法引用+Lambda |
大数据量并行处理 | 并行流+分段处理 |
彩蛋知识:Java 16引入的Stream.toList()方法
List<String> list = stream.toList(); // 直接返回不可变列表
通过掌握这些进阶技巧,我们可以写出更高效、更简洁、更安全的Java代码。建议在实际项目中结合IDEA的代码分析功能(Alt+Enter快速转换Lambda与方法引用),持续优化编码风格。
相关文章:
集合进阶2
Java不可变集合、Stream流与方法引用深度解析 一、不可变集合(Immutable Collections)进阶指南 1.1 不可变集合核心特性 防御性编程:防止外部修改数据(如传递集合给第三方库时)线程安全:天然支持多线程读…...
2025云上人工智能安全发展研究
随着人工智能(AI)技术与云计算的深度融合,云上AI应用场景不断扩展,但安全挑战也日益复杂。结合2025年的技术演进与行业实践,云上AI安全发展呈现以下关键趋势与应对策略: 一、云上AI安全的主要挑战 数据泄露…...

【C++】模版(1)
目录 1. 泛型编程 2. 函数模版 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版实例化方式 隐式实例化 显式实例化 2.5 模版参数的匹配原则 3. 模版类 模版类的定义格式 模版类的实例化 1. 泛型编程 如何实现一个通用的交换函数呢?…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究
摘要:本文探讨在去中心化商业趋势下,开源AI智能名片链动21模式S2B2C商城小程序源码如何助力企业挖掘数据价值、打破信息孤岛,实现商业高效扩散。通过分析该技术组合的架构与功能,结合实际案例,揭示其在用户关系拓展、流…...

5月19日day30打卡
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...

白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利
大家好,我是白杨SEO,专注SEO十年以上,全网SEO流量实战派,AI搜索优化研究者。 5月开始,明显就忙起来了,不管是个人陪跑还是企业顾问,不管是需要传统SEO还是新媒体流量,还是当下这个A…...
Windows软件插件-音视频捕获
下载本插件 音视频捕获就是获取电脑外接的话筒,摄像头,或线路输入的音频和视频。 本插件捕获电脑外接的音频和视频。最多可以同时获取4个视频源和4个音频源。插件可以在win32和MFC程序中使用。 使用方法 首先,加载本“捕获”DLL,…...
go 与面向对象编程(OOP)
Go 语言在设计上与传统面向对象(OOP)语言(如 Java、C)有明显差异,官方明确表示它并非纯面向对象语言。然而,它通过独特的方式实现了部分面向对象的核心特性。以下是关键分析: 1. Go 对传统 OOP…...
Mergekit——任务向量合并算法Ties解析
Mergekit——高频合并算法 TIES解析 Ties背景Ties 核心思想具体流程总结 mergekit项目地址 Mergekit提供模型合并方法可以概况为四大类:基本线性加权、基于球面插值、基于任务向量 以及一些专业化方法,今天我们来刷下基于任务向量的ties合并方法…...

Java 应用中的身份认证与授权:OAuth2.0 实现安全的身份管理
Java 应用中的身份认证与授权:OAuth2.0 实现安全的身份管理 在当今的软件开发领域,身份认证与授权是构建安全可靠应用的关键环节。而 Java 作为广泛使用的编程语言,在实现这一功能上有着诸多成熟的框架和方案。其中,OAuth2.0 凭借…...

【氮化镓】偏置对GaN HEMT 单粒子效应的影响
2025年5月19日,西安电子科技大学的Ling Lv等人在《IEEE Transactions on Electron Devices》期刊发表了题为《Single-Event Effects of AlGaN/GaN HEMTs Under Different Biases》的文章,基于实验和TCAD仿真模拟方法,研究了单粒子效应对关断状态、半开启状态和开启状态下AlG…...

Mysql 索引概述
索引(index)是帮助Mysql高效获取数据的数据结构 索引优点:1. 提高排序效率 2. 提高查询效率 索引缺点:1.索引占用空间(可忽略)2.索引降低了更新表的速度,如进行insert,update,delette 时效率降…...
HttpServletRequest常用功能简介-笔记
javax.servlet.http.HttpServletRequest 是 ServletRequest 接口的子接口,专用于处理 HTTP 协议相关的请求。它提供了访问请求行、请求头、请求参数以及请求属性等方法。 1.请求行(Request Line) ✅ 功能说明 请求行包含客户端发送的 HTTP …...

解决RAGFlow部署中镜像源拉取的问题
报错提示 Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded 解决方法 这个原因是因为拉取镜像源失败,可以在/etc/docker/daemon.json文件中添加镜像加速器,例如下面所示 {"registry…...

uniapp打包H5,输入网址空白情况
由于客户预算有限,最近写了两个uniapp打包成H5的案例,总结下面注意事项 1. 发行–网站-PCWeb或手机H5按钮,输入名称,网址 点击【发行】,生成文件 把这个给后端,就可以了 为什么空白呢 最重要一点…...
wsl2中Ubuntu22.04配置静态IP地址
第一步找到/etc/netplan目录下的01-netcfg.yaml文件,(如果不存在则自己创建一个)在里面配置一下代码: network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses: [192.168.3.222/24]routes:- to: 0.0.0.0/0via: …...

C++(21):fstream的读取和写入
目录 1 ios::out 2 ios::in和is_open 3 put()方法 4 get()方法 4.1 读取单个字符 4.2 读取多个字符 4.3 设置终结符 5 getline() 1 ios::out 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除…...

NAT/代理服务器/内网穿透
目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候,私网不能直接访问公网,就引入了NAT能讲私网转换为公网进行访问,主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网,就必…...

Unity 多时间源Timer定时器实战分享:健壮性、高效性、多线程安全与稳定性能全面解析
简介 Timer 是一个 Unity 环境下高效、灵活的定时任务调度系统,支持以下功能: •支持多种时间源(游戏时间 / 非缩放时间 / 真实时间) •支持一次性延迟执行和重复执行 •提供 ID、回调、目标对象等多种查询和销毁方式 •内建…...
深入解析Spring Boot与Spring Security的集成实践
深入解析Spring Boot与Spring Security的集成实践 引言 Spring Security是Spring生态中用于处理认证和授权的强大框架。在Spring Boot项目中集成Spring Security可以轻松实现用户认证、权限控制等功能。本文将详细介绍如何从零开始集成Spring Security,并解决实际…...

【iOS】探索消息流程
探索消息流程 Runtime介绍OC三大核心动态特性动态类型动态绑定动态语言 方法的本质代码转换objc_msgSendSELIMPMethod 父类方法在子类中的实现 消息查找流程开始查找快速查找流程慢速查找流程二分查找方法列表父类缓存查找 动态方法解析动态方法决议实例方法类方法优化 消息转发…...
用户账号及权限管理:企业安全的基石与艺术
在当今数字化时代,用户账号及权限管理已成为企业IT安全体系中不可或缺的核心组件。它不仅是保护敏感数据的第一道防线,更是确保业务运营效率和合规性的关键。本文将深入探讨用户账号及权限管理的重要性、最佳实践以及实施策略,助您构建一个安全、高效且灵活的访问控制体系。…...

413 Payload Too Large 问题定位
源头 一般是服务器或者nginx 配置导致的 nginx http {client_max_body_size 50m; # 调整为所需大小(如 50MB)# 其他配置... }nginx 不配置,默认是1M 服务器 spring 不配置也是有默认值的好像也是1M 如果出现413 可以试着修改配置来避…...

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…...

Ubuntu16.04升级gcc/g++版本方法
0 前言 gcc与g分别是GNU的c和c编译器,Ubuntu16.04默认的gcc和g的版本是5.4.0,在使用一些交叉编译工具链会提示找不到GLIBC_2.27,而GLIBC_2.27又需要gcc 6.2以上版本,因此本文介绍Ubuntu16.04升级gcc/g版本的方法。 1 Ubuntu16.0…...

微信小程序van-dialog确认验证失败时阻止对话框的关闭
使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close: wxml: <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…...
边缘计算模块
本文来源 :腾讯元宝 边缘计算模块是一种部署在网络边缘(靠近数据源)的集成化硬件/软件设备,用于实时处理本地数据,减少云端依赖,提升响应速度与安全性。以下是其核心要点: 1. 核心组成 …...
【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
【极兔快递Java社招】一面复盘|数据库线程池AQS中间件面面俱到 📍面试公司:极兔快递 👜面试岗位:Java后端开发工程师 🕐面试时长:约 60 分钟 🔄面试轮次:第 1 轮技术面&…...

OceanBase 的系统变量、配置项和用户变量有何差异
在继续阅读本文之前,大家不妨先思考一下,数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊,那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…...
Git本地使用小Tips
要将本地仓库 d:\test 的更新推送到另一个本地仓库 e:\test,可以使用 Git 的远程仓库功能。以下是具体步骤: 在 e:\test 中添加 d:\test 作为远程仓库 在 e:\test 目录中打开 Git Bash 或命令行,执行以下命令: git remo…...