当前位置: 首页 > 知识库问答 >
问题:

为什么流没有实现可迭代的?

慎俊艾
2023-03-14

在Java8中,我们有类stream ,奇怪的是,它有一个方法

Iterator<T> iterator()

所以您希望它实现interface Iterable ,这恰恰需要这个方法,但事实并非如此。

当我想使用foreach循环对流进行迭代时,我必须执行如下操作

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)) { ... }

我是不是漏了什么?

共有1个答案

施默
2023-03-14

人们已经在☺的邮件列表上问了同样的问题。主要原因是Iterable也有一个re-iterable语义,而Stream没有。

我认为主要原因是iterable意味着可重用性,而stream是只能使用一次的东西--更像是iterator

如果stream扩展了iterable,则当现有代码第二次为(元素:iterable)执行时,它收到一个iterable抛出一个异常时,可能会感到惊讶。

 类似资料:
  • 我只是想知道为什么是java。util。扫描器实现java。util。迭代器? 实现删除方法,并抛出一个不支持的操作异常。 但是一个类在实现接口时,不应该履行接口的契约吗? 实现

  • 问题内容: 为什么接口不扩展? 该方法可以简单地返回。 是故意的还是对Java设计师的监督? 能够将循环与这样的迭代器一起使用将很方便: 其中返回迭代器。 问题答案: 因为迭代器通常指向集合中的单个实例。Iterable意味着可以从一个对象获得迭代器以遍历其元素-无需迭代单个实例(迭代器代表的是该实例)。

  • 问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve

  • 我正在阅读有效的java,有一个问题。我不理解为什么流迭代器返回Iterable。据我所知,Iterable包含迭代器接口。但在流api中,即使迭代器没有继承Iterable,这段代码仍在工作。 我对这些代码很困惑。因为迭代器和Iterable之间没有关系,除了Iterable有迭代器。

  • 问题内容: 为什么?将迭代器项指针移到第一位置的最佳方法是什么? 问题答案: 为什么? 因为如果强制迭代器具有重置方法,则 每个 迭代器都必须具有重置方法。这给每个迭代器编写者额外的工作。再加上一些迭代器确实很难重置(或者真的很昂贵),并且您不希望用户对其调用reset。文件或流上的迭代器就是很好的例子。 将迭代器项指针移到第一位置的最佳方法是什么? 创建一个新的迭代器。它很少比重置昂贵。

  • 在整个microsofts stl实现过程中,几乎所有迭代器在使用前都已展开。 例如,for_each看起来像这样: _Adl_verify_range首先检查