在Java 8中,返回元素流的良好实践

路易斯

假设我有一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章