標簽:Java8, Stream API, 函數式編程, 集合操作
一、前言
隨著 Java 8 的推出,Stream API 成為了處理集合數據的一種高效方式。List.stream()
是 Java Stream API 的入口方法之一,它允許開發者將集合轉換為流,并通過鏈式調用實現諸如過濾、映射、排序等復雜邏輯。本文將系統地介紹 list.stream()
的使用方法,并提供大量代碼示例幫助理解。
二、什么是 Stream?
Stream
并不是一種新的數據結構,而是對集合進行函數式操作的抽象工具。它支持一系列中間操作(如 filter、map)和終端操作(如 collect、forEach),最終返回一個結果。
特點:
- 鏈式調用:多個操作可以串聯成一行清晰的語句。
- 惰性求值:中間操作不會立即執行,直到遇到終端操作。
- 不可復用:一個 Stream 只能被消費一次。
- 并行處理能力:可通過
parallelStream()
實現多線程處理。
三、List.stream() 的基本使用流程
List<T> result = list.stream().filter(...).map(...).sorted(...).collect(Collectors.toList());
整個過程包括:
- 創建流;
- 多個中間操作;
- 一個終端操作(如收集到列表、計數等)。
四、常用操作詳解與示例
(1) 過濾(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)
將每個元素映射為另一種形式或類型。
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
// 輸出: [5, 6, 6]
(3) 排序(Sorted)
默認按自然順序排序,也可自定義比較器。
List<String> sortedList = words.stream().sorted().collect(Collectors.toList());
// 輸出: ["apple", "banana", "cherry"]// 按長度倒序排序
List<String> customSorted = words.stream().sorted((a, b) -> b.length() - a.length()).collect(Collectors.toList());
// 輸出: ["banana", "cherry", "apple"]
(4) 去重(Distinct)
去除重復元素。
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); // 是否存在偶數
// 輸出: trueboolean allEven = numbers.stream().allMatch(n -> n % 2 == 0); // 是否全為偶數
// 輸出: false
(6) 聚合操作(Reduce)
合并流中的元素,常用于求和、最大值、最小值等。
Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
// 輸出: Optional[15]Optional<Integer> max = numbers.stream().reduce(Integer::max);
// 輸出: Optional[5]
(7) 收集結果(Collect)
將流的結果收集到指定的數據結構中。
Set<Integer> numberSet = numbers.stream().collect(Collectors.toSet());Map<Integer, String> map = numbers.stream().collect(Collectors.toMap(n -> n,n -> "Num" + n));
五、并行流(Parallel Stream)
對于大數據量處理,可使用 parallelStream()
提高性能。
List<Integer> largeList = ...; // 假設有大量數據
long count = largeList.parallelStream().filter(n -> n > 100).count();
?? 注意事項:并行流雖然提升了效率,但也可能帶來線程安全問題,需謹慎使用。
六、注意事項與最佳實踐
項目 | 說明 |
---|---|
不可復用 | 一個 Stream 只能使用一次,重復使用會拋出異常 |
惰性求值 | 中間操作不會立即執行,直到觸發終端操作 |
避免副作用 | 不要在 map 或 filter 中修改外部變量 |
合理使用并行流 | 小數據量時普通 stream 更高效,大集合才考慮 parallelStream |
七、總結
List.stream()
是 Java 8 引入的重要特性之一,極大地簡化了集合的操作邏輯,使得代碼更加簡潔、易讀、功能強大。通過本文的學習,你應該掌握了以下技能:
- 如何創建和使用 Stream;
- 各種常見中間操作(filter、map、sorted、distinct);
- 終端操作(collect、forEach、reduce、match);
- 并行流的基本使用;
- 使用過程中需要注意的問題。
掌握好 Stream API,是邁向現代 Java 開發的重要一步!
八、參考資料
- Oracle 官方文檔 - Stream
如果你覺得這篇文章對你有幫助,歡迎點贊、收藏、評論,也可以關注我的 CSDN 博客獲取更多 Java 技術干貨!