假设我有一个C类的对象c(来自库,因此我无法修改该类的定义),它扩展了Iterable。
在我的函数中,我想为用户提供一种处理类型为R的对象流的方法,其中类型R的对象是通过对类型T的对象进行转换而获得的。
目前,我正在执行以下操作:
Stream<R> f(...) {
C c = ...;
return StreamSupport.stream(c.spliterator(), false)
.map(...);
}
之所以可以使用它,是因为在Iterable类中默认情况下实现了分隔器,但是javadoc表示出于性能原因,不建议使用默认实现。
如果用户只想对它们进行处理或应用流操作,我想返回一个流以不创建列表。我对流的并行化特性不感兴趣,因为c中的对象只能以顺序方式读取。
因此,我想知道,如果有的话,推荐使用“干”来做这种事情。仅仅返回一个List或将使用者函数作为参数传递会更好吗?我有点担心javadoc建议不要使用默认的分隔符号。使用上述方法,是否可以确保在基础Stream中保留元素出现的顺序?
该规范并不表示您不应该使用它。它说:“默认实现通常应该被覆盖。” 显然,C
如果您不是班级的维护者,那么您将无法对班级进行任何处理C
。但重要的一点是,你正在使用的方式C.spliterator()
并不能阻止类的维护者C
提供定制实现spliterator()
这样有什么不妥。
毕竟,使用默认spliterator()
实现(例如没有拆分功能)的缺点也适用于所有其他解决方案。您不能添加此类功能,只有的维护者C
才能做到这一点。使用Stream
这种方式构造的you不会比使用普通方法表现更差,Iterator
因为这正是默认实现在幕后使用的内容。但是使用aStream
可以获取将来实现的优势C.spliterator()
。
如果您知道特性或规模,则C
可以构建优化的对象,Spliterator
但确实会干扰类的未来发展,C
因此请谨慎使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句