Java中List.stream()的全面使用指南(附完整示例)
一、前言
隨著 Java 8 的推出,Stream API 成為了處理集合數(shù)據(jù)的一種高效方式。List.stream() 是 Java Stream API 的入口方法之一,它允許開發(fā)者將集合轉(zhuǎn)換為流,并通過(guò)鏈?zhǔn)秸{(diào)用實(shí)現(xiàn)諸如過(guò)濾、映射、排序等復(fù)雜邏輯。本文將系統(tǒng)地介紹 list.stream() 的使用方法,并提供大量代碼示例幫助理解。
二、什么是 Stream?
Stream 并不是一種新的數(shù)據(jù)結(jié)構(gòu),而是對(duì)集合進(jìn)行函數(shù)式操作的抽象工具。它支持一系列中間操作(如 filter、map)和終端操作(如 collect、forEach),最終返回一個(gè)結(jié)果。
特點(diǎn):
- 鏈?zhǔn)秸{(diào)用:多個(gè)操作可以串聯(lián)成一行清晰的語(yǔ)句。
- 惰性求值:中間操作不會(huì)立即執(zhí)行,直到遇到終端操作。
- 不可復(fù)用:一個(gè) Stream 只能被消費(fèi)一次。
- 并行處理能力:可通過(guò)
parallelStream()實(shí)現(xiàn)多線程處理。
三、List.stream() 的基本使用流程
List<T> result = list.stream()
.filter(...)
.map(...)
.sorted(...)
.collect(Collectors.toList());
整個(gè)過(guò)程包括:
- 創(chuàng)建流;
- 多個(gè)中間操作;
- 一個(gè)終端操作(如收集到列表、計(jì)數(shù)等)。
四、常用操作詳解與示例
(1) 過(guò)濾(Filter)
篩選滿足條件的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 輸出: [2, 4]
(2) 映射(Map)
將每個(gè)元素映射為另一種形式或類型。
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
// 輸出: [5, 6, 6]
(3) 排序(Sorted)
默認(rèn)按自然順序排序,也可自定義比較器。
List<String> sortedList = words.stream()
.sorted()
.collect(Collectors.toList());
// 輸出: ["apple", "banana", "cherry"]
// 按長(zhǎng)度倒序排序
List<String> customSorted = words.stream()
.sorted((a, b) -> b.length() - a.length())
.collect(Collectors.toList());
// 輸出: ["banana", "cherry", "apple"]
(4) 去重(Distinct)
去除重復(fù)元素。
List<Integer> duplicates = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> unique = duplicates.stream()
.distinct()
.collect(Collectors.toList());
// 輸出: [1, 2, 3]
(5) 匹配(Match)
判斷是否滿足某些條件。
boolean hasEven = numbers.stream()
.anyMatch(n -> n % 2 == 0); // 是否存在偶數(shù)
// 輸出: true
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0); // 是否全為偶數(shù)
// 輸出: false
(6) 聚合操作(Reduce)
合并流中的元素,常用于求和、最大值、最小值等。
Optional<Integer> sum = numbers.stream()
.reduce(Integer::sum);
// 輸出: Optional[15]
Optional<Integer> max = numbers.stream()
.reduce(Integer::max);
// 輸出: Optional[5]
(7) 收集結(jié)果(Collect)
將流的結(jié)果收集到指定的數(shù)據(jù)結(jié)構(gòu)中。
Set<Integer> numberSet = numbers.stream()
.collect(Collectors.toSet());
Map<Integer, String> map = numbers.stream()
.collect(Collectors.toMap(
n -> n,
n -> "Num" + n
));
五、并行流(Parallel Stream)
對(duì)于大數(shù)據(jù)量處理,可使用 parallelStream() 提高性能。
List<Integer> largeList = ...; // 假設(shè)有大量數(shù)據(jù)
long count = largeList.parallelStream()
.filter(n -> n > 100)
.count();
?? 注意事項(xiàng):并行流雖然提升了效率,但也可能帶來(lái)線程安全問(wèn)題,需謹(jǐn)慎使用。
六、注意事項(xiàng)與最佳實(shí)踐
| 項(xiàng)目 | 說(shuō)明 |
|---|---|
| 不可復(fù)用 | 一個(gè) Stream 只能使用一次,重復(fù)使用會(huì)拋出異常 |
| 惰性求值 | 中間操作不會(huì)立即執(zhí)行,直到觸發(fā)終端操作 |
| 避免副作用 | 不要在 map 或 filter 中修改外部變量 |
| 合理使用并行流 | 小數(shù)據(jù)量時(shí)普通 stream 更高效,大集合才考慮 parallelStream |
七、總結(jié)
List.stream() 是 Java 8 引入的重要特性之一,極大地簡(jiǎn)化了集合的操作邏輯,使得代碼更加簡(jiǎn)潔、易讀、功能強(qiáng)大。通過(guò)本文的學(xué)習(xí),你應(yīng)該掌握了以下技能:
- 如何創(chuàng)建和使用 Stream;
- 各種常見中間操作(filter、map、sorted、distinct);
- 終端操作(collect、forEach、reduce、match);
- 并行流的基本使用;
- 使用過(guò)程中需要注意的問(wèn)題。
掌握好 Stream API,是邁向現(xiàn)代 Java 開發(fā)的重要一步!
八、參考資料
到此這篇關(guān)于Java中List.stream()全面使用指南的文章就介紹到這了,更多相關(guān)Java List.stream()使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring運(yùn)行時(shí)手動(dòng)注入bean的方法實(shí)例
spring給我們提供了IOC服務(wù),讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關(guān)于Spring運(yùn)行時(shí)手動(dòng)注入bean的相關(guān)資料,需要的朋友可以參考下2022-05-05
深入了解Java8中的時(shí)區(qū)日期時(shí)間
Java?在?java.time?包中也提供了幾個(gè)類用于處理需要關(guān)注時(shí)區(qū)的日期時(shí)間?API,本文將通過(guò)簡(jiǎn)單的示例講講它們的用法,需要的可以參考一下2023-04-04
Java多線程循環(huán)柵欄CyclicBarrier正確使用方法
這篇文章主要介紹了Java多線程循環(huán)柵欄CyclicBarrier正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
SpringBoot3.x接入Security6.x實(shí)現(xiàn)JWT認(rèn)證的完整步驟
這篇文章主要介紹了Spring?Boot?3.x中Spring?Security?6.x的安全配置變化,特別是JWT過(guò)濾器的工作原理和配置方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
Java String字符串和Unicode字符相互轉(zhuǎn)換代碼
這篇文章主要介紹了Java String字符串和Unicode字符相互轉(zhuǎn)換代碼,需要的朋友可以參考下2014-10-10

