首页 > 解决方案 > 如何将 Stream 转换为 Iterable?

问题描述

Stream继承一个iterator()方法来生成一个Iterator.

但我需要一个Iterable而不是一个Iterator.

例如,给定这个字符串:

String input = "this\n" +
        "that\n" +
        "the_other";

…我需要将字符串的这些部分作为Iterable一个特定的库传递。调用input.lines()产生一个Stream. 所以如果我能把它Stream变成Iterable它的一个元素,我就会被设置。

标签: javajava-streamiterable

解决方案


正如为什么 Stream<T> 不实现 Iterable<T>?,anIterable承担着能够提供Iterator不止一次的 a 的期望,这是 aStream无法实现的。因此,虽然您可以创建一个Iterableout of aStream以供临时使用,但您必须小心是否可能存在多次迭代它的尝试。

既然您说过,“<em>我需要将字符串的这些部分作为 anIterable传递给特定的库”,因此没有通用的解决方案,因为使用的代码Iterable超出了您的控制范围。

但是,如果您是创建流的人,则可以创建一个有效的Iterable,它将在每次Iterator请求 an 时简单地重复流构造:

Iterable<String> lines = () -> "this\nthat\nthe_other".lines().iterator();

这满足了支持任意数量的迭代的期望,同时在仅遍历一次时不会消耗比单个流更多的资源。

for(var s: lines) System.out.println(s);
lines.forEach(System.out::println);
System.out.println(String.join("\n", lines));

推荐阅读