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

把流变成可迭代的?[重复]

屠德宇
2023-03-14

继承一个迭代器()方法以生成一个迭代器

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

例如,给定以下字符串:

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

...我需要将字符串的这些部分作为Iterable传递给特定的库。调用input.lines()会产生一个Stream。因此,如果我可以将该Stream转换为其元素的Iterable,我会设置。

共有2个答案

姜玉泽
2023-03-14

只需转换,无需转换。

Cast<code>流

警告 请参阅 Holger 的答案,解释使用流支持的迭代器的危险

是的,您可以从中进行可迭代

解决方案很简单,但不明显。请参阅Maurice Naftalin的Lambda FAQ上的这篇文章。

返回<code>迭代器<code>的<code>基流<code>方法</code>(<code>流<code>的超类)的<code<迭代器

做出你的输入。

String input = "this\n" +
        "that\n" +
        "the_other";
Stream<String> stream = input.lines() ;

使用方法引用生成<code>可迭代

Iterable< String > iterable = stream::iterator;

测试结果。

for ( String s : iterable ) 
{
    System.out.println( "s = " + s );
}

查看此代码在IdeOne.com.运行

s=这个

s = 那个

s=the_other

警告:小心流支持的<code>可迭代<code>的风险。霍尔格在正确答案中解释。

薛阳荣
2023-03-14

正如《为什么流

因为您说过,“我需要将字符串的这些部分作为< code>Iterable传递给特定的库”,所以没有通用的解决方案,因为使用< code>Iterable的代码不在您的控制范围内。

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

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));
 类似资料:
  • 在Rust中学习迭代器时,我创建了以下结构来隐藏二维集合的实现: 和方法的目标是这个结构的用户不需要担心数据是以行主格式还是列主格式存储;迭代器将简单地以最有效的顺序提供元素。 然而,在使用这种数据结构时,我通常需要知道特定的行和列,以便获得一些外部数据: 但是一旦我尝试调用方法,我就会得到以下编译器错误: 什么是实现我在这里尝试的正确方法?我可以添加一个<code>set</code>方法,该方

  • 本文向大家介绍Python迭代器与可迭代与生成器,包括了Python迭代器与可迭代与生成器的使用技巧和注意事项,需要的朋友参考一下 示例 一个迭代是一个对象,可以返回一个迭代器。具有状态且具有__iter__  方法并返回迭代器的任何对象都是可迭代的。也可能是没有状态的对象,该对象实现了__getitem__方法。-该方法可以获取索引(从零开始),并IndexError在索引不再有效时引发。 Py

  • 有没有办法在for循环中使变量可迭代?我正在尝试制作一个密码生成器,对于for循环,我使用一个输入数字的变量。 当我试图在循环中使用变量时,我得到< code > ' int ' object is not iterable 。

  • 我收到一个编译错误:

  • 我正在将我的google dataflow java 1.9迁移到beam 2.0,并尝试使用BigtableIO。写 在大舞台前的巴黎公园里,我正在努力让它变得更容易接受。 上述代码引发以下异常InvalidProtocolBufferException:协议消息结束组标记与预期标记不匹配 v是对象列表(Vitals.class)。hbase api使用Put方法创建变异。如何创建将与Bigta

  • 在Java8中,我们有类stream ,奇怪的是,它有一个方法 所以您希望它实现interface Iterable ,这恰恰需要这个方法,但事实并非如此。 当我想使用foreach循环对流进行迭代时,我必须执行如下操作 我是不是漏了什么?