Ich muss Code schreiben, der den Inhalt eines Java 8-Streams mehrfach zu einer Liste hinzufügt, und ich habe Probleme herauszufinden, wie das am besten funktioniert. Nach dem, was ich lese auf SO (vor allem diese Frage: How to add elements of a Java8 stream into an existing List) und anderswo, ich habe es verengt auf die folgenden Optionen:Was ist der beste Weg, Elemente aus einem Stream zu einer bestehenden Liste hinzuzufügen?
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Accumulator<S, T> {
private final Function<S, T> transformation;
private final List<T> internalList = new ArrayList<T>();
public Accumulator(Function<S, T> transformation) {
this.transformation = transformation;
}
public void option1(List<S> newBatch) {
internalList.addAll(newBatch.stream().map(transformation).collect(Collectors.toList()));
}
public void option2(List<S> newBatch) {
newBatch.stream().map(transformation).forEach(internalList::add);
}
}
Die Idee ist, dass die Verfahren mehrmals für die gleiche Instanz aufgerufen werden würde von Accumulator
. Die Auswahl besteht darin, eine Zwischenliste zu verwenden und Collection.addAll()
einmal außerhalb des Streams aufzurufen oder collection.add()
aus dem Stream für jedes Element aufzurufen.
Ich würde eher Option 2 bevorzugen, die mehr im Sinne der funktionalen Programmierung ist, und vermeiden Sie die Erstellung einer Zwischenliste, jedoch könnte es Vorteile zu rufen addAll()
n 0 Mal anrufen, wenn n groß ist.
Ist eine der beiden Optionen deutlich besser als die andere?
BEARBEITEN: JB Nizet hat eine sehr coole answer, die die Umwandlung verzögert, bis alle Chargen hinzugefügt wurden. In meinem Fall ist es erforderlich, dass die Transformation sofort durchgeführt wird.
PS: In meinem Beispiel-Code, habe ich transformation
als Platzhalter für das, was Operationen verwendet, die auf dem Strom
Der disassemblierte Bytecode (javap) könnte Ihnen helfen, herauszufinden –
Tun Sie keine vorzeitigen Optimierungen. Tun Sie, was sauberer ist, und nur wenn Sie Leistungsprobleme haben, überprüfen Sie diesen Code mit einem Profiler. –
Ich glaube nicht, dass es irgendwelche Vorteile für den Aufruf von 'addAll()' gibt. – shmosel