为什么原始流没有 collect(Collector)?
我正在为新手程序员编写一个库,所以我试图保持API尽可能干净。
我的库需要做的一件事是对大量整数或多头集合执行一些复杂的计算。我的用户需要从中计算这些值,这些方案和业务对象很多,所以我认为最好的方法是使用流来允许用户将业务对象映射到收集器,然后计算收集器内部的计算。IntStream
LongStream
但是,IntStream 和 LongStream 只有 3 个参数收集方法:
collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
并且没有更简单的方法。collect(Collector)
Stream<T>
所以不是能够做到
Collection<T> businessObjs = ...
MyResult result = businessObjs.stream()
.mapToInt( ... )
.collect( new MyComplexComputation(...));
我必须提供这样的供应商,累加器和组合器:
MyResult result = businessObjs.stream()
.mapToInt( ... )
.collect(
()-> new MyComplexComputationBuilder(...),
(builder, v)-> builder.add(v),
(a,b)-> a.merge(b))
.build(); //prev collect returns Builder object
对于我的新手用户来说,这太复杂了,而且非常容易出错。
我的解决方法是创建静态方法,这些方法将 or 作为输入,并为您隐藏收集器的创建和执行IntStream
LongStream
public static MyResult compute(IntStream stream, ...){
return .collect(
()-> new MyComplexComputationBuilder(...),
(builder, v)-> builder.add(v),
(a,b)-> a.merge(b))
.build();
}
但这并没有遵循使用Streams的正常惯例:
IntStream tmpStream = businessObjs.stream()
.mapToInt( ... );
MyResult result = MyUtil.compute(tmpStream, ...);
因为您必须保存一个临时变量并将其传递给静态方法,或者在静态调用中创建 Stream,当它与其他参数混合到我的计算中时,这可能会令人困惑。
有没有一种更清洁的方法来做到这一点,同时仍然使用 或 ?IntStream
LongStream