2016-12-04 31 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组合在一起。