【发布时间】:2017-10-09 15:33:30
【问题描述】:
为了防止实现细节泄露,而不是返回,例如,Collection<MyCoolObject>,可以实现Iterable<MyCoolObject>,然后需要从Iterable 接口实现Iterator<T>。因此,无论内部数据结构如何管理,对元素的访问都是通过Iterator。
使用 Java 8,可能希望将 Stream<MyCoolObject> stream() 添加到 MyCoolObject。 (另请参阅:Java 8 Lambdas 一书中支持stream 的建议)。虽然添加方法并不困难(我确实阅读了关于Why Iterable Doesn't Provide Stream 的问题),但Java 没有为Streamable<T> 添加接口以反映Iterable<T> 的想法似乎很奇怪。 (好吧,可能因为Streamable 存在一个不同的名称,以便永远使用CORBA 的东西)。
我想我遵循了关于为什么将Stream 添加到Iterable 可能存在问题的答案,但我不明白为什么不能提供Streaming<T> 接口。例如,Collections 可能已经实现了Streaming<T> 接口,它可以让其他对象更清楚地知道我们可以期待stream() 方法。
根据对上述问题的回答,可以通过
从Iterable 获得Stream
Stream s = StreamSupport.stream(iter.spliterator(), false);
但这似乎需要做很多工作,因为 MyObject 可能只想实现 stream() 以允许对象的用户这样做
myObject.stream().filter(...).collect(...)
没有来自迭代器的干预转换。
是否有缺少用于流式传输对象的接口的原因?除了在 MyCoolObject 上实现 stream() 并让某人查看 Javadoc 以便他们知道它具有 stream() 方法之外,还有更好的方法吗?
或者,很可能,我对 Stream 的方法有误解吗?
(另外,我在 CoolObject 中实现了stream(),但后来忘记实现parallelStream(),这可以通过拥有接口来缓解)。
【问题讨论】:
-
如何实现接口比提供方法更清晰?无论哪种方式,您都必须查看 Javadoc。 (当
stream().parallel()做同样的事情时,为什么还要打扰parallelStream()?)您还没有特别清楚地说明您希望interface 添加什么而不是直接添加stream()方法。 -
您不需要
Streaming接口来提供stream方法。Iterable支持 for-each 循环。对于流,API 需要采用通用的流生成对象而不是仅采用流吗? -
@LouisWasserman 在返回对象时进行抽象?这样你就可以说:“这里取这个对象,你可以从中获取一个Stream,但你不需要确切知道它是什么类型的对象”
-
@KevinO 提供一些价值的策略通常由功能接口更好地描述,例如供应商
。流提供了 iterator()方法来获取迭代器(仅一次),那么为什么不将策略声明为 Supplier>? -
我不会反对一个名字,因为在 CORBA 中有一个同名的类。里面有很多类,很难找到一个不存在的名字。就从
Object开始吧……
标签: java java-8 java-stream