Es gibt eine weitere Variante der collect-Methode, die von der LongStream-Klasse bereitgestellt wird, und ebenfalls von den Klassen IntStream und DoubleStream.
R collect(Supplier supplier,
ObjLongConsumer accumulator,
BiConsumer combiner)
Führt eine mutierbare Reduktionsoperation auf den Elementen dieses Streams aus. Eine mutierbare Reduktion ist eine, bei der der reduzierte Wert ein mutierbarer Ergebniscontainer ist, wie z.B. ein ArrayList, und Elemente werden eingefügt, indem der Zustand des Ergebnisses aktualisiert wird, anstatt das Ergebnis zu ersetzen. Dies ergibt ein Ergebnis, das äquivalent zu ist:
R result = supplier.get();
for (long element : this stream)
accumulator.accept(result, element);
return result;
Wie bei reduce(long, LongBinaryOperator) können auch Sammelvorgänge parallelisiert werden, ohne zusätzliche Synchronisation zu erfordern. Dies ist eine Terminaloperation.
Und die Antwort auf deine Frage mit dieser collect-Methode lautet wie folgt :
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, (list, value) -> list.add(value)
, (list1, list2) -> list1.addAll(list2));
Hier ist die Methodenreferenzvariante, die ziemlich clever, aber etwas knifflig zu verstehen ist:
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, List::add , List::addAll);
Als Nächstes folgt die HashSet-Variante :
LongStream.of(1L, 2L, 3L, 3).filter(i -> i > 2)
.collect(HashSet::new, HashSet::add, HashSet::addAll);
Außerdem ist die LinkedList-Variante wie folgt :
LongStream.of(1L, 2L, 3L, 3L)
.filter(i -> i > 2)
.collect(LinkedList::new, LinkedList::add, LinkedList::addAll);