假设我有一个C类的对象c(来自库,因此我无法修改类定义),它扩展了Iterable。
在我的函数中,我想为用户提供一种处理R类型对象流的方法,其中R类型的对象是通过对类型为T的对象进行转换获得的。
目前我执行以下操作:
Stream<R> f(...) {
C c = ...;
return StreamSupport.stream(c.spliterator(), false)
.map(...);
}
它的工作原理是因为在Iterable类中默认实现了spliterator,但是javadoc表示不建议出于性能原因使用默认实现。
如果用户只想处理或应用流操作,我想返回一个Stream来不创建List。 我对流的并行化属性不感兴趣,因为c中的对象只能以顺序方式读取。
所以我想知道,whay是推荐的方式,如果有的话,做这种事情。简单地返回List或传递消费者函数作为参数更好吗?我有点担心javadoc建议不要使用默认的spliterator实现。 通过上述方法,我可以确保在基础Stream中保留元素外观的顺序吗?
答案 0 :(得分:4)
规范并未说明您不应该使用它。 It says:“通常应该覆盖默认实现。”如果您不是类C
的维护者,很明显您对类C
无法做任何事情。但重要的一点是,您使用C.spliterator()
的方式不会阻止类C
的维护者提供spliterator()
的自定义实现,所以没有什么错了。
毕竟,使用默认spliterator()
实现(如没有拆分功能)的缺点也适用于所有其他解决方案。您无法添加此类功能,只有C
的维护者可以执行此操作。以这种方式构造的Stream
使用普通Iterator
的性能不会差,因为这正是默认实现将在引擎盖下使用的。但使用Stream
可以获得C.spliterator()
的未来实施优势。
如果你知道C
的特征或大小,你可以construct an optimized Spliterator
,但这确实会干扰班级C
的未来演变,因此会小心使用。