在 java 8 中,返回元素流的好习惯

lou*_*uis 1 java java-8

假设我有一个 C 类的对象 c(来自一个库,所以我不能修改类定义)它扩展了 Iterable。

在我的函数中,我想为用户提供一种处理类型 R 对象流的方法,其中类型 R 的对象是通过对类型 T 的对象进行转换获得的。

目前我执行以下操作:

Stream<R> f(...) {
  C c = ...;
  return StreamSupport.stream(c.spliterator(), false)
  .map(...);
}
Run Code Online (Sandbox Code Playgroud)

它之所以有效是因为 spliterator 在类 Iterable 中默认实现,但 javadoc 说出于性能原因不建议使用默认实现。

如果用户只想处理或应用流操作,我想返回一个流而不创建列表。我对流的并行化属性不感兴趣,因为 c 中的对象只能以顺序方式读取。

所以我想知道,如果有的话,做这种事情的推荐方式是什么。简单地返回一个 List 还是传递一个消费者函数作为参数更好?我有点担心建议不要使用默认拆分器实现的 javadoc。使用上述方法,我可以确保保留底层 Stream 中元素出现的顺序吗?

Hol*_*ger 5

规范并没有说你不应该使用它。它说:“通常应该覆盖默认实现。” 很明显,C如果您不是 class 的维护者,则您无法对 class 做任何事情C。但重要的一点是,你正在使用的方式C.spliterator()不能阻止类的维护者C提供定制实现spliterator()这样有什么不妥。

毕竟,使用默认spliterator()实现的缺点(例如没有拆分功能)也适用于所有其他解决方案。您无法添加此类功能,只有 的维护者C才能这样做。在Stream你构建这样就不会表现更差,使用普通Iterator作为这正是默认的实现将引擎盖下使用的。但是使用 aStream允许获得C.spliterator().

如果您知道特征或大小,则C可以构建优化,Spliterator但这确实会干扰类的未来演变,C因此请谨慎使用。