相关疑难解决方法(0)

为什么Stream <T>没有实现Iterable <T>?

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

Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)

所以你会期望它实现接口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)) { ... }
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

java iterable java-8 java-stream

254
推荐指数
5
解决办法
3万
查看次数

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

我想知道为什么Iterable界面不提供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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个Hand的实现,因为你可以在玩卡片游戏时手中拿着牌.

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

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

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> …
Run Code Online (Sandbox Code Playgroud)

java java-8

234
推荐指数
3
解决办法
3万
查看次数

标签 统计

java ×2

java-8 ×2

iterable ×1

java-stream ×1