Java Stream List是Java 8中引入的一個新特性,它是JDK中的Stream API(java.util.stream)和List集合(java.util.List)的結合體,提供了一種管道式(stream)處理List的方式。
一、Stream基本操作
Stream為我們提供了非常方便的鏈式操作,可以清晰的表達數據處理的過程。首先,我們需要了解Stream基本操作的概念。
一般來說,一個Stream流程被分為三個部分: 源(source), 中間操作(intermediate), 終止操作(terminal)。舉個例子:
List<String> list = Arrays.asList("one", "two", "three", "four", "five");
list.stream()
.filter(s -> s.startsWith("t"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
在這個例子中,list是我們的源(source),每個中間操作(intermediate)都會將原始Stream轉化為一個新的Stream,最後一個終止操作(terminal)會將Stream轉為某個形式的結果,或執行一些操作(e.g. forEach)。
二、Stream與List相結合
對於一個List集合來說,Stream API提供了一些方法來將List轉化為Stream,比如:
stream()
:返回由此列表支持的順序StreamparallelStream()
:返回一個並行Stream
我們可以利用這些方法來進行數據處理,例如過濾、篩選、排序等操作:
List<String> list = Arrays.asList("one", "two", "three", "four", "five");
list.stream()
.filter(s -> s.startsWith("t"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
運行結果為:
TWO
THREE
代碼解釋:
filter(s -> s.startsWith("t"))
是中間操作(intermediate)。它會將原始的Stream轉化為一個新的Stream,
其中只包含以t開頭的字元串。map(String::toUpperCase)
是一個中間操作(intermediate)。它會將原始的Stream轉化為一個新的Stream,
其中每個字元串轉化為大寫形式。sorted()
是一個中間操作(intermediate)。它會產生一個新的Stream,並對其中的元素進行排序,
默認按照自然序升序排序。forEach(System.out::println)
是一個終止操作(terminal),它會對Stream中的所有元素執行指定操作,
此處為列印到控制台。
三、Stream的常見操作
除了上面提到的基本操作,Stream API還提供了許多其他的方法,可以讓我們對Stream進行更加複雜的處理。
1. Map操作
Map操作是一種將Stream中的每個元素轉換為另一個對象的操作。例如,我們可以使用map操作將Stream中的每個String對象轉換為Integer類型:
List<String> list = Arrays.asList("1", "2", "3", "4", "5");
list.stream()
.map(Integer::valueOf)
.forEach(System.out::println);
運行結果為:
1
2
3
4
5
代碼解釋:
map(Integer::valueOf)
通過方法引用,將Stream中的每個字元串對象轉換為Integer類型。
2. FlatMap操作
FlatMap操作是一種將Stream中每個元素轉換為另一個Stream對象的操作。例如,我們可以使用flatMap操作將一個Stream<List<T>>轉換為Stream<T>:
List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("x", "y", "z");
List<List<String>> nestedList = Arrays.asList(list1, list2);
nestedList.stream()
.flatMap(Collection::stream)
.forEach(System.out::println);
運行結果為:
a
b
c
x
y
z
代碼解釋:
flatMap(Collection::stream)
將每個二級List轉換為一個Stream,然後合併到一起。
3. Filter操作
Filter操作是一種通過Predicate<T>來過濾Stream中元素的操作。例如,下面的代碼演示了如何過濾Stream中的偶數:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
運行結果為:
2
4
代碼解釋:
filter(n -> n % 2 == 0)
使用lambda表達式過濾掉了Stream中的奇數。
4. Reduce操作
Reduce操作是一種將Stream中前面的元素與後面的元素依次操作的操作,返回一個Optional<T>對象。例如,我們可以使用reduce操作求出List中所有元素的和:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> result = list.stream().reduce((a, b) -> a + b);
System.out.println(result.get());
運行結果為:
15
代碼解釋:
reduce((a, b) -> a + b)
對Stream中所有的元素求和。
四、小結
Java Stream List提供了一種非常方便的方式來操作List集合。Stream提供了Pipeline(管道)式的處理方式,將原始的數據集合轉化為一個新的Stream,然後經過一系列的中間操作(intermediate),最終產生一個結果或執行一些操作(terminal)。
在實際應用中,我們可以使用Stream API來完成各種各樣的數據操作,例如數據轉換、數據過濾、數據處理等。對於一些複雜的業務邏輯,Stream API的鏈式操作可以讓代碼保持優雅、簡潔。
原創文章,作者:HOGK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/140185.html