集合进阶2

news2025/5/21 0:53:17

Java不可变集合、Stream流与方法引用深度解析


一、不可变集合(Immutable Collections)进阶指南

1.1 不可变集合核心特性

  • 防御性编程:防止外部修改数据(如传递集合给第三方库时)
  • 线程安全:天然支持多线程读操作
  • 内存优化:JVM可进行深度优化(如字符串常量池机制)

1.2 创建方式对比

创建方式适用场景JDK版本
List.of()元素≤10的List9+
Set.of()元素唯一且≤10的Set9+
Map.ofEntries()键值对>10的Map9+
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
构造方法引用类名::newStudent::new
数组构造引用类型[]::newString[]::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与方法引用),持续优化编码风格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】模版(1)

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

基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究

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

5月19日day30打卡

模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …

白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利

大家好&#xff0c;我是白杨SEO&#xff0c;专注SEO十年以上&#xff0c;全网SEO流量实战派&#xff0c;AI搜索优化研究者。 5月开始&#xff0c;明显就忙起来了&#xff0c;不管是个人陪跑还是企业顾问&#xff0c;不管是需要传统SEO还是新媒体流量&#xff0c;还是当下这个A…

Java 应用中的身份认证与授权:OAuth2.0 实现安全的身份管理

Java 应用中的身份认证与授权&#xff1a;OAuth2.0 实现安全的身份管理 在当今的软件开发领域&#xff0c;身份认证与授权是构建安全可靠应用的关键环节。而 Java 作为广泛使用的编程语言&#xff0c;在实现这一功能上有着诸多成熟的框架和方案。其中&#xff0c;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 索引概述

索引&#xff08;index&#xff09;是帮助Mysql高效获取数据的数据结构 索引优点&#xff1a;1. 提高排序效率 2. 提高查询效率 索引缺点&#xff1a;1.索引占用空间&#xff08;可忽略&#xff09;2.索引降低了更新表的速度&#xff0c;如进行insert,update,delette 时效率降…

解决RAGFlow部署中镜像源拉取的问题

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

uniapp打包H5,输入网址空白情况

由于客户预算有限&#xff0c;最近写了两个uniapp打包成H5的案例&#xff0c;总结下面注意事项 1. 发行–网站-PCWeb或手机H5按钮&#xff0c;输入名称&#xff0c;网址 点击【发行】&#xff0c;生成文件 把这个给后端&#xff0c;就可以了 为什么空白呢 最重要一点&#xf…

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 打开文件用于写入数据。如果文件不存在&#xff0c;则新建该文件&#xff1b;如果文件原来就存在&#xff0c;则打开时清除…

NAT/代理服务器/内网穿透

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

Unity 多时间源Timer定时器实战分享:健壮性、高效性、多线程安全与稳定性能全面解析

简介 Timer 是一个 Unity 环境下高效、灵活的定时任务调度系统&#xff0c;支持以下功能&#xff1a; •支持多种时间源&#xff08;游戏时间 / 非缩放时间 / 真实时间&#xff09; •支持一次性延迟执行和重复执行 •提供 ID、回调、目标对象等多种查询和销毁方式 •内建…

【iOS】探索消息流程

探索消息流程 Runtime介绍OC三大核心动态特性动态类型动态绑定动态语言 方法的本质代码转换objc_msgSendSELIMPMethod 父类方法在子类中的实现 消息查找流程开始查找快速查找流程慢速查找流程二分查找方法列表父类缓存查找 动态方法解析动态方法决议实例方法类方法优化 消息转发…

413 Payload Too Large 问题定位

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

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…

Ubuntu16.04升级gcc/g++版本方法

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

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

OceanBase 的系统变量、配置项和用户变量有何差异

在继续阅读本文之前&#xff0c;大家不妨先思考一下&#xff0c;数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊&#xff0c;那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…

【Python】Jupyter指定具体路径

一、右键Jupyter Notebook 右击Jupyter Notebook点击属性 二、修改以下两个地方

RNope:结合 RoPE 和 NoPE 的长文本建模架构

TL;DR 2025 年 Cohere 提出的一种高效且强大的长上下文建模架构——RNope-SWA。通过系统分析注意力模式、位置编码机制与训练策略&#xff0c;该架构不仅在长上下文任务上取得了当前最优的表现&#xff0c;还在短上下文任务和训练/推理效率方面实现了良好平衡。 Paper name …