为了防止实现细节泄露,而不是返回例如Collection<MyCoolObject>
,可以实现Iterable<MyCoolObject>
,这将需要从Iterable
接口实现Iterator<T>
。因此,无论内部数据结构如何管理,对元素的访问都是通过Iterator
进行的。
在Java8中,人们可能希望在MyCoolObject
中添加Stream<MyCoolObject> stream()
。(另请参阅:Java8lambdas一书中关于支持stream
的建议)。(好吧,可能是因为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的方法有什么误解?
发布于 2017-05-11 17:13:56
Because it was removed,但如果需要,您可以很容易地推出自己的Streamable
实现:
@FunctionalInterface
interface Streamable<T> {
Stream<T> stream();
}
如果我们以策略模式为例,那么您可以这样定义它:
interface StreamStrategy<T> {
Streamable<T> getStreamable();
}
这可以使用方法引用基于提供返回Stream<T>
的方法的任何后备对象来容易地实现。例如,如果您有一个集合:
class CollectionBasedStrategy<T> implements StreamStrategy<T> {
@Override
public Streamable<T> getStreamable() {
return new ArrayList<T>()::stream;
}
}
如果Collection
扩展了这样的Streamable
接口,那么您实际上不需要使用方法引用。但除此之外,在JDK中似乎没有太多的附加价值-如果需要的话,它仍然可以在以后添加。
https://stackoverflow.com/questions/43901726
复制相似问题