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

时间:2014-11-24 10:27:27

标签: java java-8

假设我有一个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中保留元素外观的顺序吗?

1 个答案:

答案 0 :(得分:4)

规范并未说明您不应该使用它。 It says:“通常应该覆盖默认实现。”如果您不是类C的维护者,很明显您对类C无法做任何事情。但重要的一点是,您使用C.spliterator()的方式不会阻止C的维护者提供spliterator()的自定义实现,所以没有什么错了。

毕竟,使用默认spliterator()实现(如没有拆分功能)的缺点也适用于所有其他解决方案。您无法添加此类功能,只有C的维护者可以执行此操作。以这种方式构造的Stream使用普通Iterator的性能不会差,因为这正是默认实现将在引擎盖下使用的。但使用Stream可以获得C.spliterator()的未来实施优势。

如果你知道C的特征或大小,你可以construct an optimized Spliterator,但这确实会干扰班级C的未来演变,因此会小心使用。