LongStream 类和类似的 IntStream 和 DoubleStream 类提供了 collect 方法的另一种变体。
<R> R collect(Supplier<R> supplier,
ObjLongConsumer<R> accumulator,
BiConsumer<R,R> combiner)
对此流的元素执行可变归约操作。可变归约是这样一种归约,其中归约值是一个可变结果容器,例如 ArrayList,并且通过更新结果的状态而不是替换结果来合并元素。这会产生等效于:
R result = supplier.get();
for (long element : this stream)
accumulator.accept(result, element);
return result;
与 reduce(long, LongBinaryOperator) 一样,collect 操作可以并行化,无需额外同步。这是终端操作。
用这个收集方法回答你的问题如下:
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, (list, value) -> list.add(value)
, (list1, list2) -> list1.addAll(list2));
下面是方法参考变体,它非常聪明,但有些难以理解:
LongStream.of(1L, 2L, 3L, 3L).filter(i -> i > 2)
.collect(ArrayList::new, List::add , List::addAll);
下面将是 HashSet 变体:
LongStream.of(1L, 2L, 3L, 3).filter(i -> i > 2)
.collect(HashSet::new, HashSet::add, HashSet::addAll);
同样 LinkedList 变体是这样的:
LongStream.of(1L, 2L, 3L, 3L)
.filter(i -> i > 2)
.collect(LinkedList::new, LinkedList::add, LinkedList::addAll);