2016-12-04 5 views
-2

Ich habe eine Funktion, die einen Int-Stream erstellt, die verschiedenen Zeichen findet, sortiert und dann sammelt sie in einer neuen Liste und erstellt dann eine Zeichenfolge. Unten ist die Funktion.Java 8 Int Stream mit StringBuilder sammeln

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(); 
} 

ich wirklich zu arbeiten, habe Schwierigkeiten, wie das Sammeln mit dem String funktioniert, ich habe online recherchiert und die Java-Dokumentation kann aber keinen Sinn daraus machen. Von dem, was ich ausmachen kann, erstellt es eine neue Instanz von StringBuilder und hängt einfach jedes Zeichen im Stream an, kann jemand eine bessere Erklärung geben? Danke

+1

Lesen Sie das Tutorial: https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html#collect –

+1

Es ist wichtig zu wissen, was genau Sie beunruhigt. Ist es die Verwendung von 'Collect' mit 3 Parametern? Sind es die Methodenreferenzen 'StringBuilder :: new' und andere? – Tunaki

+0

Ja, es sind die 3 Parameter, die mich verwirren – pocockn

Antwort

5

Argument 1: Erzeugt Ihr Ausgangsergebnis (in diesem Fall Ihr neues StringBuilder).

Argument 2: Fügt ein Element (String) zu Ihrem Ergebnis hinzu (StringBuilder).

Argument 3: Wenn Sie den Stream parallel ausführen, wird mehrere StringBuilders erstellt. Dies ist für die Kombination dieser zusammen.

6

Um die drei Argumente zu verstehen, müssen Sie verstehen, was der Stream tun muss: Er durchläuft Zeichen und muss sie an einen StringBuilder anhängen.

Als erstes müssen Sie wissen, wie Sie einen leeren StringBuilder erstellen können. Das ist das erste Argument: Es stellt eine Funktion bereit, die, wenn sie vom Stream aufgerufen wird, einen leeren StringBuilder erstellt.

Die zweite Sache, die es wissen muss, ist, was mit jedem Zeichen im Stream zu tun ist. Es muss sie an den StringBuilder anhängen. Das ist das zweite Argument: Es ist eine Funktion, die, wenn sie vom Stream aufgerufen wird, das Zeichen an den StringBuilder anfügt.

Das ist alles, was Sie brauchen, wenn der Stream sequenziell ist. Wenn der Stream jedoch parallel ist, teilt der Stream die Elemente in mehrere Teile auf und verarbeitet jeden Teil parallel. Nehmen wir an, dass es nur zwei Teile verwendet. Sie ruft die erste Funktion zweimal auf, um zwei leere StringBuilder zu erstellen, und verarbeitet jeden Teil parallel, indem sie die zweite Funktion verwendet, um Zeichen an die beiden StringBuilder anzuhängen.

Am Ende wird jeder Teil in einen StringBuilder umgewandelt, der die Hälfte der Zeichen enthält. Der Stream muss also wissen, wie diese beiden StringBuilder zusammen kombiniert werden. Dafür gibt es das dritte Argument. Es ist eine Funktion, die, wenn sie vom Stream aufgerufen wird, die beiden StringBuilder miteinander kombiniert, indem sie alle Zeichen von der zweiten an die erste anhängt.