1.收集元素

最後,我們到達了類中最有趣的方法Streamcollect()方法。它用於從流移動到我們熟悉的集合—— List<T>Set<T>Map<T, R>其他。

collect()方法將一個特殊collector對像作為參數。該對像從流中讀取所有數​​據,將其轉換為特定類型的集合,然後返回。然後 collect 方法本身返回這個集合。

所有這些都是以一種相當巧妙的方式完成的:collector對象的類型是Collector<T, A, R>. 如您所見,它具有三個類型參數。最後一個類型參數 ( R) 通常是類似List<T>. 這意味著編譯器可以使用此類型來確定方法本身的正確返回類型collect()

我希望你不要太困惑。在任何情況下,您都不需要自己創建 Collector 對象。類的靜態方法返回的現成對象Collectors就足夠了。

收藏

該類Collectors有幾個靜態方法可以返回現成的收集器對象——適合各種場合。在這裡,我們將考慮最重要的。

toList()
將流轉換為列表的對象 ( List<T>)
toSet()
將流轉換為集合的對象 ( Set<T>)
toMap()
將流轉換為 map( Map<K, V>)的對象
joining()
將流的元素連接成單個字符串
mapping()
將字符串的元素轉換為Map<K, V>
groupingBy()
對元素進行分組並返回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(", ") );