首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么没有提供Stream<E>的接口呢?

为什么没有提供Stream<E>的接口呢?
EN

Stack Overflow用户
提问于 2017-05-11 04:00:02
回答 1查看 970关注 0票数 16

为了防止实现细节泄露,而不是返回例如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

代码语言:javascript
复制
Stream s = StreamSupport.stream(iter.spliterator(), false);

但考虑到MyObject可能只想实现stream()以允许对象的用户执行以下操作,这似乎需要做大量的工作

代码语言:javascript
复制
myObject.stream().filter(...).collect(...)

而不需要来自迭代器的中间转换。

有没有理由没有一个接口来支持流式传输对象?有没有比仅仅在MyCoolObject上实现stream()并让人查看Javadoc,从而知道它有stream()方法更好的方法呢?

或者,很可能是,我对Stream的方法有什么误解?

EN

回答 1

Stack Overflow用户

发布于 2017-05-11 17:13:56

Because it was removed,但如果需要,您可以很容易地推出自己的Streamable实现:

代码语言:javascript
复制
@FunctionalInterface
interface Streamable<T> {
    Stream<T> stream();
}

如果我们以策略模式为例,那么您可以这样定义它:

代码语言:javascript
复制
interface StreamStrategy<T> {
    Streamable<T> getStreamable();
}

这可以使用方法引用基于提供返回Stream<T>的方法的任何后备对象来容易地实现。例如,如果您有一个集合:

代码语言:javascript
复制
class CollectionBasedStrategy<T> implements StreamStrategy<T> {
    @Override
    public Streamable<T> getStreamable() {
        return new ArrayList<T>()::stream;
    }
}

如果Collection扩展了这样的Streamable接口,那么您实际上不需要使用方法引用。但除此之外,在JDK中似乎没有太多的附加价值-如果需要的话,它仍然可以在以后添加。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43901726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档