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

为什么Iterable不提供stream()和parallelStream()方法?

孟沛
2023-03-14
public class Hand implements Iterable<Card> {
    private final List<Card> list = new ArrayList<>();
    private final int capacity;

    //...

    @Override
    public Iterator<Card> iterator() {
        return list.iterator();
    }
}

本质上,它包装了列表 ,确保了最大容量,并提供了一些其他有用的特性。更好的方法是直接将其实现为列表

现在,为了方便起见,我认为最好实现iterable ,这样,如果您想要循环它,就可以使用增强的for-loops。(我的hand类还提供了get(int index)方法,因此我认为iterable 是合理的。)

iterable接口提供以下功能(省略了javadoc):

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
Stream<Hand> stream = StreamSupport.stream(hand.spliterator(), false);
    null

共有1个答案

郎祯
2023-03-14

这不是遗漏;2013年6月对EG清单进行了详细讨论。

专家组的明确讨论正是基于这一思路。

虽然stream()iterable上似乎是有意义的“显而易见”(甚至最初对专家组来说也是如此),但iterable如此笼统的事实却成了一个问题,因为明显的签名:

Stream<T> stream()
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}
Stream s = StreamSupport.stream(iter.spliterator(), false);
 类似资料:
  • 问题内容: 我想知道为什么接口不提供和方法。考虑以下类别: 它是 一手 牌的一种实现,因为您在玩交易纸牌游戏时可以手拿牌。 本质上,它包装了,可确保最大容量并提供其他一些有用的功能。最好将其直接实现为。 现在,为了方便起见,我认为实现起来会很不错,这样,如果您想对其进行循环,则可以使用增强的for循环。(我的课程也提供了一种方法,因此我认为该方法是合理的。) 该界面提供了以下内容(省略了javad

  • 问题内容: 我一定在这里想念什么。 在Java 5中,引入了“ for- each循环”语句(也称为增强的for循环) 。似乎引入它主要是为了遍历 Collections 。任何实现该接口的集合(或容器)类都可以使用“ for- each循环”进行迭代。也许出于历史原因,Java数组未实现Iterable接口。但是由于数组是普遍存在的,因此可以接受在数组上使用for- each循环(生成与传统的f

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona

  • 问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和

  • 问题内容: 在Java 8中,我们有类,它奇怪地有一个方法 因此,您可能希望它实现接口,而该接口正是需要此方法,但事实并非如此。 当我想使用foreach循环遍历Stream时,我必须做类似的事情 我在这里想念什么吗? 问题答案: 人们已经在邮件列表 asked 上问过同样的问题。主要原因是Iterable也具有可重复的语义,而Stream没有。 我认为主要原因是Iterable暗示可重用性,而S