java - 为什么 Iterable<T> 不提供 stream() 和 parallelStream() 方法?

标签 java java-8 java-stream iterable

我想知道为什么 Iterable接口(interface)不提供stream()parallelStream()方法。考虑以下类:

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();
    }
}

它是Hand的一种实现,因为您可以在玩集换式卡牌游戏时手中有牌。

基本上它包装了 List<Card> ,确保最大容量并提供一些其他有用的功能。最好直接将其实现为 List<Card> .

现在,为了方便起见,我认为实现 Iterable<Card> 会很好。 ,这样如果你想循环它,你可以使用增强的 for 循环。 (我的 Hand 类还提供了一个 get(int index) 方法,因此我认为 Iterable<Card> 是合理的。)

Iterable接口(interface)提供以下内容(省略 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);

所以到真正的问题:

  • 为什么 Iterable<T>不提供实现 stream() 的默认方法和 parallelStream() , 我看不出有什么可以使这不可能或不需要的?

我发现的一个相关问题如下:Why does Stream<T> not implement Iterable<T>?
奇怪的是,它暗示它以相反的方式去做。

最佳答案

这不是遗漏; 2013年6月EG名单有详细讨论。

专家组的权威讨论 Root 于this thread .

虽然 stream() 似乎“很明显”(即使对专家组来说,最初也是如此)似乎对 Iterable 有意义,事实是Iterable太笼统成了一个问题,因为明显的签名:

Stream<T> stream()

并不总是你想要的。一些事情是Iterable<Integer>宁愿让他们的流方法返回 IntStream , 例如。但是把 stream()在层次结构中如此高的方法将使这成为不可能。因此,我们使制作 Stream 变得非常容易。来自 Iterable , 通过提供 spliterator()方法。 stream()的执行在 Collection只是:

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

任何客户端都可以从 Iterable 获取他们想要的流。与:

Stream s = StreamSupport.stream(iter.spliterator(), false);

最后我们得出结论,添加 stream()Iterable会出错。

关于java - 为什么 Iterable<T> 不提供 stream() 和 parallelStream() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114015/

相关文章:

java - 在没有 Apache POI 的情况下解析 Excel 文件

java - 在android中处理xml文件后出现奇怪的字符

java - 有没有办法将现有界面变成功能界面?

Java 8 Stream 和数组操作

Java 流 - 按嵌套列表分组(按第二顺序列出)

java - 从常量构建静态 map

java - 一个线程可以同时持有两个锁吗?

java - 需要将 keylistener 从一个类分离到另一个类中

java - 如何使用 Java Stream 逐行读取文件

java - 如何使用 Stream 从嵌套列表中获取符合特定条件的所有列表?