LongStream类和提供了收集方法的另一种变体
IntStream和DoubleStream类也类似。
<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);