文章目錄
- Java 8 Stream API
- 1. Stream
- 2. Stream 的創建
- 3. 常見的 Stream 操作
- 3.1 中間操作
- 3.2 終止操作
- 4. Stream 的并行操作
Java 8 Stream API
- Java 8 引入了 Stream API,使得對集合類(如
List
、Set
等)的操作變得更加簡潔和直觀。Stream API 主要目的是為了簡化對集合數據的處理,尤其是支持 函數式編程 風格的操作。 - Stream 可以讓你使用聲明式的方式進行集合操作,而不是傳統的命令式方式。
1. Stream
- 在 Java 8 中,Stream 是一個用于處理數據集合(如
List
、Set
、Map
等)的工具,它允許你在不修改集合本身的情況下,通過一系列的操作(如過濾、映射、聚合等)來對數據進行處理。 - Stream 是一個流式的、單向的數據結構,意味著你一次只能處理流中的一個元素,且每次處理后的流會產生新的流對象,原始流不會發生改變。
2. Stream 的創建
Stream 可以通過以下幾種方式創建:
-
從集合創建 Stream:
List<String> list = Arrays.asList("apple", "banana", "cherry"); Stream<String> stream = list.stream();
-
從數組創建 Stream:
String[] array = {"apple", "banana", "cherry"}; Stream<String> stream = Arrays.stream(array);
-
使用 Stream.of() 創建 Stream:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
3. 常見的 Stream 操作
- Stream API 提供了兩類操作:中間操作和終止操作。
3.1 中間操作
-
中間操作是惰性操作(Lazy),它們不會立即執行,直到你觸發一個終止操作時,才會開始執行整個流的計算。常見的中間操作包括:
-
filter:用于過濾流中的元素,返回符合條件的元素。
List<String> list = Arrays.asList("apple", "banana", "cherry", "date"); List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList()); System.out.println(filteredList); // 輸出: [apple]
-
map:用于將流中的元素通過函數轉換成另一個類型的元素(通常是映射操作)。
List<String> list = Arrays.asList("apple", "banana", "cherry"); List<String> upperCaseList = list.stream().map(String::toUpperCase).collect(Collectors.toList()); System.out.println(upperCaseList); // 輸出: [APPLE, BANANA, CHERRY]
-
distinct:去除重復的元素。
List<String> list = Arrays.asList("apple", "banana", "apple", "cherry"); List<String> distinctList = list.stream().distinct().collect(Collectors.toList()); System.out.println(distinctList); // 輸出: [apple, banana, cherry]
-
sorted:對流中的元素進行排序。
List<String> list = Arrays.asList("banana", "apple", "cherry"); List<String> sortedList = list.stream().sorted().collect(Collectors.toList()); System.out.println(sortedList); // 輸出: [apple, banana, cherry]
-
flatMap:將流中的每個元素映射成多個元素,然后再將所有這些元素合并成一個流。
List<List<String>> listOfLists = Arrays.asList(Arrays.asList("apple", "banana"),Arrays.asList("cherry", "date"));List<String> flatMappedList = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList()); System.out.println(flatMappedList); // 輸出: [apple, banana, cherry, date]
3.2 終止操作
終止操作是激活流計算的操作,調用終止操作時流會開始遍歷并進行計算。常見的終止操作包括:
-
collect:將流中的元素收集到集合中,是最常用的終止操作。
List<String> list = Arrays.asList("apple", "banana", "cherry"); List<String> result = list.stream().collect(Collectors.toList()); System.out.println(result); // 輸出: [apple, banana, cherry]
-
forEach:對流中的每個元素進行操作,通常用于打印。
List<String> list = Arrays.asList("apple", "banana", "cherry"); list.stream().forEach(System.out::println); // 輸出: // apple // banana // cherry
-
reduce:用于對流中的元素進行累加或合并,通常用于求和、求最小值或求最大值。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().reduce(0, Integer::sum); System.out.println(sum); // 輸出: 15
-
anyMatch:檢查流中的任何一個元素是否符合指定的條件。
List<String> list = Arrays.asList("apple", "banana", "cherry"); boolean hasApple = list.stream().anyMatch(s -> s.equals("apple")); System.out.println(hasApple); // 輸出: true
-
allMatch:檢查流中的所有元素是否符合指定的條件。
List<String> list = Arrays.asList("apple", "banana", "cherry"); boolean allStartWithA = list.stream().allMatch(s -> s.startsWith("a")); System.out.println(allStartWithA); // 輸出: false
-
count:計算流中元素的數量。
List<String> list = Arrays.asList("apple", "banana", "cherry"); long count = list.stream().count(); System.out.println(count); // 輸出: 3
4. Stream 的并行操作
- Stream 還提供了并行流,它可以將計算任務分配給多個線程以加速處理。在調用
parallel()
方法后,流的操作會在多個線程中并行執行,從而提高大數據量處理的性能。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
System.out.println(sum); // 輸出: 21
- 并行流適用于數據量較大的場景,但在小數據集下可能會由于線程管理的開銷而降低性能。因此,是否使用并行流需要根據具體情況判斷。