集合進階2

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.pswp.cn/news/906221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906221.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL企業版免費開啟,強先體驗

近期Oracle突然宣布&#xff0c;MySQL企業版面向開發者免費開放下載&#xff0c;這一消息瞬間引爆DBA圈。作為數據庫領域的“頂配車型”&#xff0c;企業版長期因高昂授權費讓中小團隊望而卻步&#xff0c;如今免費開放無異于“勞斯萊斯開進菜市場”。 本文將深度拆解企業版的…

數據要素及征信公司數據要素實踐

數據要素及征信公司數據要素實踐 1.數據要素的定義與核心特征2.征信公司應用數據要素的實踐路徑3.總結1.數據要素的定義與核心特征 數據要素是數字經濟時代的新型生產要素,指以電子形式存在、通過計算方式參與生產經營活動并創造價值的數據資源。 其核心特征包括: 新型生產…

Golang 范型

引言 Go 從 1.18 開始正式支持泛型&#xff0c;帶來了更強的類型抽象能力&#xff0c;使得我們可以編寫更通用、可復用的代碼。本文檔將介紹下泛型與應用的一些內容 什么是泛型 泛型&#xff08;Generic&#xff09;是一種允許你編寫“參數化類型”的編程方式。你可以將類型…

vue-ganttastic甘特圖label標簽橫向滾動固定方法

這個甘特圖之前插件里&#xff0c;沒有找到能固定label標簽在屏幕上的辦法&#xff0c;用css各種辦法都沒有實現&#xff0c;所以我我直接手寫定位&#xff0c;用js監聽滾動條滾動的距離&#xff0c;然后同步移動甘特圖label標簽&#xff0c;造成一種定位的錯覺&#xff0c;以下…

VS2017編譯openssl3.0.8

openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有:SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編解碼庫、證書請求(PKCS10)編解碼、數字證書編解碼、CRL編解碼、OCSP協議、數字證書驗證、P…

16【架構進階】Flask藍圖與應用工廠模式:構建企業級Web應用的核心技巧

【架構進階】Flask藍圖與應用工廠模式&#xff1a;構建企業級Web應用的核心技巧 前言&#xff1a;為什么應用架構決定項目的天花板&#xff1f; 在Flask開發中&#xff0c;隨著項目規模的擴大&#xff0c;如何組織代碼結構成為決定項目可維護性和擴展性的關鍵因素。單文件應用…

系統架構設計-案例分析總結

系統架構設計-案例分析總結 2024年下半年系統架構設計師案例第1題 2022年下半年系統架構設計師案例第1題第2題 2021年下半年系統架構設計師案例第1題第2題 2024年下半年系統架構設計師案例 題&#xff1a;效用樹可用性中ping/echo策略和心跳策略比較 第1題 閱讀以下關于面向質…

軟件架構風格系列(6):解釋器架構

文章目錄 引言一、從計算器到規則引擎&#xff1a;解釋器架構的核心本質&#xff08;一&#xff09;什么是解釋器架構&#xff1f;&#xff08;二&#xff09;核心組件&#xff1a;構建“語言理解系統”的三駕馬車 二、架構設計圖&#xff1a;從輸入到執行的完整鏈路三、Java實…

Serverless 的未來與進階:持續學習之路

Serverless 的未來與進階&#xff1a;持續學習之路 恭喜你&#xff0c;堅持走到了《輕松入門 Serverless》系列博客的最后一篇&#xff01; 回顧我們的旅程&#xff0c;我們一起&#xff1a; 揭開了 Serverless 的神秘面紗&#xff0c;理解了它的核心思想、關鍵特征以及 Faa…

設備數據看板助力自動化工廠實現生產智能精細化管理

工廠數字化轉型需要實現自動化設備生產現場可視化、設備系統間的互聯互通&#xff0c;以及數據的智能決策。然而&#xff0c;當前許多制造企業仍面臨著傳統單機設備同質化嚴重、數字化服務能力不足、售后成本高企、系統集成效率低下等挑戰。企業如何通過自動化裝備看板和實時數…

pcie phy電氣層(PCS)詳解gen1、2 (rx)

注&#xff1a;推薦大家查看英文原版&#xff0c;筆者大部分內容也為翻譯&#xff1b; S IP&#xff1a; 1. pcie供電&#xff1a; Vph&#xff1a; 1.2&#xff0c;1.5&#xff0c; 1.8V high voltage IO supply&#xff1b; Vp/VptxX/Vpdig &#xff1a;analog supply&am…

Java—— File詳解

說明 File對象就表示一個路徑&#xff0c;可以是文件的路徑、也可以是文件夾的路徑 這個路徑可以是存在的&#xff0c;也允許是不存在的 獲取File對象 方法名稱說明public File(String pathname)根據文件路徑創建文件對象public File(String parent,String child)根據父路徑名…

【數字圖像處理】半開卷復習提綱

1&#xff1a;要求 2張A4紙以內&#xff0c;正反面均可寫 &#xff08;不過博主由于墨水浸到背面了&#xff0c;采用了把2張單面通過雙面膠粘起來的方法&#xff0c;結果考前半個小時都在用這個難用的雙面膠。。。&#xff09; 2&#xff1a;提綱內容 3&#xff1a;提示 考的…

Neovim 如何安裝和配置縮進標識插件 indent-blankline.nvim

Neovim 0.9 以?lazy.nvim?為核心的現代化配置指南 一次性搞定插件管理、UI 優化與高效行跳轉 適用平臺&#xff1a;Linux&#xff0f;macOS&#xff0f;WSL&#xff0f;Windows (Neovim ≥?0.9) 目錄 為什么選?lazy.nvim安裝與初始化 2.1 創建配置目錄 2.2 克隆?lazy.nvi…

VulnHub | Breach - 1

&#x1f31f; 關注這個靶場的其它相關筆記&#xff1a;[網安靶場] 紅隊綜合滲透靶場 —— VulnHub 靶場筆記合集 Breach: 1 ~ VulnHubBreach: 1, made by mrb3n. Download & walkthrough links are available.https://vulnhub.com/entry/breach-1,152/ 0x01&#xff1a;…

城市綜合管廊監測與維護一體化解決方案

一、 方案概述 城市綜合管廊監測主要源于現代城市對地下管線管理的迫切需求。隨著城市化進程的加快&#xff0c;地下管線作為城市的“生命線”&#xff0c;其重要性日益凸顯。傳統的地下管線管理方式存在分散、低效、易產生信息孤島和管理盲區等問題&#xff0c;已無法滿足現代…

【iOS】alloc的實際流程

目錄 前言 為什么不按源碼流程調用&#xff1f; alloc的調用流程 前言 在之前的博客中我們有學習到過alloc的底層原理&#xff0c;沿著源碼一步步找到了alloc的調用鏈——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstan…

MySQL 故障排查與生產環境優化

目錄 一、前置知識點 MySQL的運行原理 1. 客戶端連接 2. SQL 解析與優化 3. 存儲引擎處理 4. 日志與持久化 二、MySQL 單實例故障排查 &#xff08;1&#xff09;故障現象1 &#xff08;2&#xff09;故障現象2 &#xff08;3&#xff09;故障現象3 &#xff08;4&am…

C++學習:六個月從基礎到就業——C++20:模塊(Modules)與其他特性

C學習&#xff1a;六個月從基礎到就業——C20&#xff1a;模塊(Modules)與其他特性 本文是我C學習之旅系列的第五十三篇技術文章&#xff0c;也是第三階段"現代C特性"的第十五篇&#xff0c;深入探討C20引入的模塊(Modules)系統及其他重要特性。查看完整系列目錄了解…

Vue百日學習計劃Day36-42天詳細計劃-Gemini版

總目標: 在 Day 36-42 理解組件化開發的思想&#xff0c;熟練掌握 Vue 組件的注冊、Props、Events、v-model、Slots、Provide/Inject 等核心概念和實踐&#xff0c;能夠構建可復用和易于維護的組件結構。 所需資源: Vue 3 官方文檔 (組件基礎): https://cn.vuejs.org/guide/es…