2016-12-04 54 views
-2

我有一個函數可以創建一個int流,找到不同的字符,對它們進行排序,然後將它們收集到一個新列表中,然後創建一個字符串。以下是功能。用StringBuilder收集Java 8 Int Stream

public static String longest(String s1, String s2) { 
    String s = s1 + s2; 
    return s.chars() 
      .distinct() 
      .sorted() 
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 
      .toString(); 
} 

我真的很努力工作,如何與StringBuilder的工作的收集,我在網上搜索和Java文檔,但不能使任何意義。從我能做出來的事情來看,它創建了一個StringBuilder的新實例,並將每個字符添加到流中,任何人都可以給出更好的解釋嗎?謝謝

+1

閱讀教程:https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html#collect –

+1

重要的是要知道究竟是什麼讓你感到困擾。是否使用3個參數的「collect」?它是方法引用'StringBuilder :: new'和其他嗎? – Tunaki

+0

是的,這是3個收集參數令我感到困惑 – pocockn

回答

5

參數1:創建您的起始結果(在這種情況下,您的新StringBuilder)。

參數2:爲您的結果(StringBuilder)添加一個元素(String)。

參數3:如果您並行運行流,則會創建多個StringBuilders。這是爲了將這些結合在一起。

6

要理解這三個參數,您需要了解流需要做什麼:它通過字符循環,並且必須將它們附加到StringBuilder。

所以首先需要知道的是如何創建一個空的StringBuilder。這是第一個參數的作用:它提供了一個函數,當被流調用時,它創建一個空的StringBuilder。

它需要知道的第二件事是如何處理流中的每個字符。它必須將它們附加到StringBuilder。這就是第二個參數的用途:它是一個函數,當被流調用時,該函數會將該字符附加到StringBuilder。

如果流是連續的,那麼這就是你所需要的。但是如果數據流是並行的,數據流會將這些數據分成幾部分,並且並行處理每個部分。假設它只使用兩個部分。它調用第一個函數兩次以創建兩個空的StringBuilders,並使用第二個函數將字符添加到兩個StringBuilders中並行處理每個部分。

最後,每個部分都被轉換爲包含一半字符的StringBuilder。所以流需要知道如何將這兩個StringBuilder結合在一起。這就是第三個理由。這是一個函數,當由Stream調用時,通過將第二個字符的所有字符附加到第一個字符串將兩個StringBuilder組合在一起。