一、Collect的簡介
Collect是Java 8 Stream API中一種非常實用的終止操作,可以將Stream中的數據轉化為特定的容器(Collection)或 Map對象,而且可以自定義轉化的方式。這樣可以方便地將Stream中的數據轉換成我們需要的格式。
Collect方法的具體實現位於Collectors類中,它包含了很多靜態方法來實現收集器,包括toList、toSet、toMap等等。這些方法都返回一個Collector接口,用於對Stream中的數據進行轉化。
二、toList和toSet
toList和toSet方法是比較常用的Collector接口方法,對於我們需要將Stream數據轉換為List或Set類型時,非常方便。
1. toList方法
toList方法將Stream中的數據轉化為List類型,常用於將Stream流中的數據轉化為List類型的集合,如下代碼所示:
List<String> list = Stream.of("Java", "Python", "Go")
.filter(s -> s.length() > 2) // 過濾出長度大於2的字符串
.map(String::toUpperCase) // 將字符串轉換為大寫
.collect(Collectors.toList()); // 轉換為List類型
執行結果:[JAVA, PYTHON]
2. toSet方法
toSet方法將Stream中的數據轉化為Set類型,常用於將Stream流中的數據轉化為Set類型的集合,如下代碼所示:
Set<String> set = Stream.of("Java", "Python", "Go")
.filter(s -> s.length() > 2) // 過濾出長度大於2的字符串
.map(String::toUpperCase) // 將字符串轉換為大寫
.collect(Collectors.toSet()); // 轉換為Set類型
執行結果:[PYTHON, JAVA]
三、toMap方法
toMap方法可以將Stream中的數據轉化為Map類型,常用於將Stream流中的數據轉化為Map類型的集合。需要注意的是,如果Stream中存在相同的key,就會拋出IllegalStateException異常。
1. 簡單的toMap使用方法
toMap方法可以使用Function類型的鍵提取器和映射器,來將Stream流中的數據轉化為Map類型的集合,如下代碼所示:
Map<String, Integer> map = Stream.of("a", "bb", "ccc")
.collect(Collectors.toMap(String::toUpperCase, String::length));
執行結果:{CCC=3, BB=2, A=1}
2. toMap方法指定重複鍵值的處理方式
toMap方法默認情況下,如果Stream流中存在相同的key,就會拋出IllegalStateException異常。但是我們可以通過指定後一個值覆蓋前一個值的方式來解決這個問題。請看下面的代碼:
Map<String, Integer> map = Stream.of("a", "bb", "cc", "dd")
.collect(Collectors.toMap(String::length, String::length, (a, b) -> b));
執行結果:{1=1, 2=2}
四、joining方法
joining方法用於將字符序列(CharSequence)中的元素連接成一個字符串。默認情況下,joining方法會將字符串連接為逗號分隔的形式,如下代碼所示:
String str = Stream.of("Java", "Python", "Go").collect(Collectors.joining());
執行結果:JavaPythonGo
joining方法也可以接受一個字符串作為分隔符,如下代碼所示:
String str = Stream.of("Java", "Python", "Go").collect(Collectors.joining("-"));
執行結果:Java-Python-Go
五、summing方法
summing方法用於將Stream流中數字類型的元素進行求和。下面是一個使用summing方法的例子:
int sum = Stream.of(1, 2, 3, 4, 5).collect(Collectors.summingInt(Integer::intValue));
執行結果:15
六、groupingBy方法
groupingBy方法用於根據某個條件進行分組。下面是一個使用groupingBy方法的例子:
Map<Integer, List<String>> map = Stream.of("Java", "Python", "Go", "C", "C++")
.collect(Collectors.groupingBy(String::length));
執行結果:{1=[C], 2=[Go, C++], 4=[Java], 6=[Python]}
七、partitioningBy方法
partitioningBy方法用於將Stream流中的元素按照一個條件分為兩部分,返回結果是一個Map類型,其中的key值是true或false,分別代表滿足條件和不滿足條件的元素集合。下面是一個使用partitioningBy方法的例子:
Map<Boolean, List<String>> map = Stream.of("Java", "Python", "C", "Go", "C++")
.collect(Collectors.partitioningBy(s -> s.startsWith("J")));
執行結果:{false=[Python, C, Go, C++], true=[Java]}
原創文章,作者:YJCII,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370348.html