java – 为什么原始Stream没有收集(收集器)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么原始Stream没有收集(收集器)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1773字,纯文字阅读大概需要3分钟。
内容图文
我正在为新手程序员编写一个库,所以我试图保持API尽可能干净.
我的库需要做的一件事就是对大量的int或long进行一些复杂的计算.我的用户需要从中计算这些值所需的大量场景和业务对象,因此我认为最好的方法是使用流来允许用户将业务对象映射到IntStream或LongStream,然后计算收集器内的计算.
但是IntStream和LongStream只有3参数collect方法:
collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
并且没有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专业化的原型.我们发现 – 除了明显的更专业类型的烦恼之外 – 如果没有完整的原始专用集合(如Trove,或者GS-Collections,但是JDK所做的那样),这并不是非常有用.没有).例如,没有IntArrayList,Collector.OfInt只是将拳击推送到其他地方 – 从收集器到容器 – 这没有大的胜利,以及更多的API表面.
内容总结
以上是互联网集市为您收集整理的java – 为什么原始Stream没有收集(收集器)?全部内容,希望文章能够帮你解决java – 为什么原始Stream没有收集(收集器)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。