Java Stream是Java 8中新增的一種數據流操作方式,它可以在集合操作中提供簡潔、高效且易讀的代碼實現,是Java 8中的一個重要特性。在本文中,我們將從多個方面來詳解Java Stream流的使用方式和注意事項。
一、Stream的基本概念
Stream(流)是一個來自數據源元素的並發處理集合,支持並行和順序聚合操作。數據源可以是集合、數組等。
在創建Stream時需要指定數據源,可以通過集合中的stream()方法或數組中的Arrays.stream()方法來生成Stream。然後,在對Stream進行操作後,通過collect()方法將Stream輸出為集合或數組等數據類型。
例如,下面的代碼以List為數據源創建一個Stream並輸出其中的偶數元素:
List list = Arrays.asList(1, 2, 3, 4, 5, 6); list.stream() .filter(e -> e % 2 == 0) .forEach(System.out::println); // 輸出 2 4 6
二、Stream的操作方式
在Java Stream中,常用的操作方式包括過濾、排序、映射、匹配等。在使用這些操作方式前,我們需要掌握Java Lambda表達式的基本語法結構。
1. 過濾操作
在Stream中,可以通過filter(Predicate predicate)方法對數據進行過濾。它的作用是從Stream中選擇符合條件的元素,並生成一個新的Stream。
例如,下面的代碼通過filter方法過濾出List中大於3的元素:
List list = Arrays.asList(1, 3, 5, 2, 4); list.stream() .filter(e -> e > 3) .forEach(System.out::println); // 輸出 5 4
2. 映射操作
在Stream中,可以通過map(Function mapper)方法對數據進行映射,它的作用是對Stream中的每個元素執行一段特定的函數,將結果收集到新的Stream中。
例如,下面的代碼通過map方法將List中的元素乘以2:
List list = Arrays.asList(1, 2, 3, 4, 5); list.stream() .map(e -> e * 2) .forEach(System.out::println); // 輸出 2 4 6 8 10
3. 排序操作
在Stream中,可以通過sorted()方法對數據進行排序,它的作用是按照自然順序對Stream中的元素進行排序。除此之外,還可以通過sorted(Comparator comparator)方法傳入自定義的Comparator來進行排序。
例如,下面的代碼通過sorted方法對List中的元素進行排序:
List list = Arrays.asList(3, 2, 1, 5, 4); list.stream() .sorted() .forEach(System.out::println); // 輸出 1 2 3 4 5
4. 匹配操作
在Stream中,可以通過anyMatch(Predicate predicate)、allMatch(Predicate predicate)和noneMatch(Predicate predicate)三種方法判斷Stream中是否存在符合條件的元素。它們分別代表是否存在任意一個、全部和沒有一個元素符合條件。
例如,下面的代碼通過anyMatch方法判斷List中是否存在大於3的元素:
List list = Arrays.asList(1, 2, 3, 4, 5); boolean result = list.stream() .anyMatch(e -> e > 3); System.out.println(result); // 輸出 true
三、Stream的注意事項
在使用Stream時,需要注意以下幾點:
1. Stream是一次性使用的
Stream是一種流式處理的方式,每個操作都會生成一個新的Stream。由於Stream只是源數據的一種視圖,因此Stream的數據只能使用一次,否則會拋出異常。
例如,下面的代碼在對List進行過濾後再次對其排序會發生異常:
List list = Arrays.asList(3, 2, 1, 5, 4); Stream stream = list.stream(); stream.filter(e -> e > 3); stream.sorted(); // 會拋出異常,因為stream已經被使用過
2. Stream是惰性求值的
Stream是惰性求值的,只有遇到終止操作(如forEach、toArray、reduce等)時才會執行中間操作。
例如,下面的代碼中使用map操作後並沒有輸出,只有在forEach操作時才會輸出結果:
List list = Arrays.asList("a", "b", "c"); list.stream() .map(e -> e.toUpperCase()) .forEach(System.out::println); // 輸出 A B C
3. 避免使用Stream進行I/O操作
Stream不是為了進行I/O操作而設計的。對文件、網路等I/O操作,應該使用Java原生的I/O API。
四、總結
在本文中,我們從Stream的基本概念、操作方式和注意事項三個方面詳解了Java Stream流的使用方式。Stream操作可以使代碼更簡潔而不失可讀性,但在使用時需要注意避免使用多次和I/O操作等問題,結合具體業務場景加以應用,可以使我們的代碼更加高效而利於維護。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270068.html