我正在为新手程序员编写一个库,所以我试图保持API尽可能干净。
我的库需要做的事情之一是对大量的ints或long集合执行一些复杂的计算。我的用户需要从许多场景和业务对象中计算这些值,因此我认为最好的方法是使用流来允许用户将业务对象映射到intstream
或longstream
,然后在收集器中计算这些计算。
collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
所以与其能够做到
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
这对我的新手用户来说太复杂了,而且很容易出错。
public static MyResult compute(IntStream stream, ...){
return .collect(
()-> new MyComplexComputationBuilder(...),
(builder, v)-> builder.add(v),
(a,b)-> a.merge(b))
.build();
}
IntStream tmpStream = businessObjs.stream()
.mapToInt( ... );
MyResult result = MyUtil.compute(tmpStream, ...);
在使用intstream
或longstream
的同时,是否有一种更干净的方法可以做到这一点?
事实上,我们对一些collector.ofxxx
专门化进行了原型化。我们发现--除了更专门化类型的明显烦恼之外--如果没有完整的原语专门化集合(就像Trove或GS集合一样,但JDK没有),这并不是非常有用的。例如,如果没有IntArrayList,一个Collector.Ofint只是将装箱推到其他地方--从收集器到容器--这没有什么大的好处,而且会有更多的API表面。
问题内容: 为什么大多数其他数据类型都没有Java的String基本类型? 问题答案: 字符串是一个对象,根本不是原始类型,只是一个字符数组。James Gosling的访谈 摘录摘述了Java中根本存在原始类型的原因,这很有趣。 Bill Venners: Java为什么会有原始类型?为什么不是所有事物都只是一个对象? James Gosling: 完全是效率问题。有各种各样的人已经建立了以in
为什么并行流使用合并器类,而顺序流将使用累加器?为什么并行流不使用累加器? 以下是上述代码的输出: 那么,为什么顺序流使用累加器,并行流使用组合器?并行流不能使用累加器吗?
问题内容: 在深入研究之后,我发现Stream和Collector之间存在许多重复的逻辑,这些逻辑违反了不要重复自己的原则,例如:jdk-9和中的Stream#map&Collectors#mapping,Stream#filter&Collectors#filtering。等等 但自从溪流遵守告诉,不要问得墨meter耳的法则/ 得墨Law律和集热器遵守继承构成原则看来,这是合理的。 我只能想到
请允许我提出一些抱怨,也许是令人厌烦但我想描述的是:“为什么会提出这个问题呢?”。我昨天晚上在这里、这里、这里回答的问题和其他人不一样。 Stream operations在做一些简单的工作时比Collector更有表现力,但是它们比Collector更慢,因为它会为每个操作创建一个新的Stream,并且Stream比Collector更繁重和抽象。例如: 收集器无法将短路终端操作作为流应用。例如
我试图理解是什么保存了对对象的引用,使得它们在执行Java流终端操作时不符合垃圾收集的条件? 这是我的测试代码 从未调用LargetObject的finalize方法。 我的想法是一旦. map(largeObject- 为什么这不会发生?也许真的可以做些什么?
我正在尝试使用JUnit错误收集器报告错误。虽然我的断言失败了,但JUnit中并没有报告错误。但我在控制台中收到了“错误”信息。