一尘不染

为什么Stream <T>不实现Iterable <T>?

javascript

在Java 8中,我们有类Stream <T>,它奇怪地有一个方法

Iterator<T> iterator()

因此,您可能希望它实现接口Iterable<T>,而该接口正是需要此方法,但事实并非如此。

当我想使用foreach循环遍历Stream时,我必须做类似的事情

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }

我在这里想念什么吗?


阅读 316

收藏
2020-09-27

共1个答案

一尘不染

人们已经在邮件列表 asked 上问过同样的问题。主要原因是Iterable也具有可重复的语义,而Stream没有。

我认为主要原因是Iterable暗示可重用性,而Stream它只能使用一次,更像是Iterator。

如果Stream扩展Iterable当它接收到那么现有的代码可能会感到惊讶Iterable的是抛出一个Exception他们做第二次for (element : iterable)

2020-09-27