gpt4 book ai didi

java - 为什么原始流没有收集(收集器)?

转载 作者:IT老高 更新时间:2023-10-28 21:06:22 26 4
gpt4 key购买 nike

我正在为新手程序员编写一个库,所以我试图让 API 尽可能干净。

我的库需要做的一件事是对大量 int 或 long 集合执行一些复杂的计算。我的用户需要从中计算这些值的场景和业务对象很多,所以我认为最好的方法是使用流来允许用户将业务对象映射到 IntStreamLongStream然后计算收集器内部的计算。

但是 IntStream 和 LongStream 只有 3 个参数的 collect 方法:

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

这对我的新手用户来说太复杂了,而且很容易出错。

我的解决方法是制作采用 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 ?

最佳答案

事实上,我们做了一些 Collector.OfXxx 特化的原型(prototype)。我们发现——除了更特化类型的明显烦恼之外——如果没有完整的原始特化集合(如 Trove 所做的,或 GS-Collections,但 JDK 所做的),这并不是非常有用没有)。例如,如果没有 IntArrayList,Collector.OfInt 只会将装箱推到其他地方——从收集器到容器——这并没有什么大的胜利,而且还有更多的 API 表面。

关于java - 为什么原始流没有收集(收集器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30310749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com