1.收集元素
最後,我們到達了類中最有趣的方法Stream
,collect()
方法。它用於從流移動到我們熟悉的集合—— List<T>
、Set<T>
和Map<T, R>
其他。
該collect()
方法將一個特殊collector
對像作為參數。該對像從流中讀取所有數據,將其轉換為特定類型的集合,然後返回。然後 collect 方法本身返回這個集合。
所有這些都是以一種相當巧妙的方式完成的:collector
對象的類型是Collector<T, A, R>
. 如您所見,它具有三個類型參數。最後一個類型參數 ( R
) 通常是類似List<T>
. 這意味著編譯器可以使用此類型來確定方法本身的正確返回類型collect()
。
我希望你不要太困惑。在任何情況下,您都不需要自己創建 Collector 對象。類的靜態方法返回的現成對象Collectors
就足夠了。
收藏級
該類Collectors
有幾個靜態方法可以返回現成的收集器對象——適合各種場合。在這裡,我們將考慮最重要的。
|
將流轉換為列表的對象 ( List<T> ) |
|
將流轉換為集合的對象 ( Set<T> ) |
|
將流轉換為 map( Map<K, V> )的對象 |
|
將流的元素連接成單個字符串 |
|
將字符串的元素轉換為Map<K, V> |
|
對元素進行分組並返回Map<K, V> |
2. 將流轉換為列表
以下是使用流並將結果轉換為列表的典型示例
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
我們從集合中得到了一個流。然後我們通過只保留第一個字符是大寫的字符串得到一個新的流。然後將該流中的所有數據收集到一個集合中,然後將其返回。
3. 將流轉換為集合
以下是使用流並將結果轉換為集合的典型示例
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
一切都與將流轉換為 a 的代碼非常相似List
,只是我們使用了不同的收集器對象,該對象由該toSet()
方法返回。
4. 將流轉換為地圖
但是將流轉換為地圖有點困難。Map 中的每個條目都包含兩個元素:一個鍵和一個值。我們需要弄清楚我們將如何為流中的每個元素定義鍵和值。
例子:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
Map<String, String> result = list.stream()
.map( e -> e.split("=") )
.filter( e -> e.length == 2 )
.collect( Collectors.toMap(e -> e[0], e -> e[1]) );
讓我們來看看這裡發生了什麼。
在第一行中,我們使用map(...)
將每個字符串轉換為字符串數組。使用 split 方法,我們將每個字符串分成兩部分。
在第二行中,我們filter()
只將那些恰好包含兩個元素的數組傳遞給該方法。該d==3
字符串被拆分為三個元素的數組,這與過濾器不匹配。
最後,在最後一行中,我們將流轉換為Map<String, String>
. 兩個函數被傳遞給該toMap()
方法。對於流中的每個元素,第一個函數應該返回 key,第二個函數返回 value。
每個數組的第一個元素(“a”、“b”、“c”)將是我們的鍵,每個數組的第二個元素(“2”、“3”、“4”)將是我們的值。
5. 將流轉換為字符串
另一個有趣的收集器對象由 返回Collectors.joining()
。它將流的所有元素轉換為String
並將它們連接成一個字符串。例子
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );