java - 如何将 Stream 转换为 Iterable?
问题描述
Stream
继承一个iterator()方法来生成一个Iterator
.
例如,给定这个字符串:
String input = "this\n" +
"that\n" +
"the_other";
…我需要将字符串的这些部分作为Iterable
一个特定的库传递。调用input.lines()
产生一个Stream
. 所以如果我能把它Stream
变成Iterable
它的一个元素,我就会被设置。
解决方案
正如为什么 Stream<T> 不实现 Iterable<T>?,anIterable
承担着能够提供Iterator
不止一次的 a 的期望,这是 aStream
无法实现的。因此,虽然您可以创建一个Iterable
out 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));
推荐阅读
- kettle - PDI - 要检查的条件是每个 csv 文件的行数超过 1
- typescript - item 没有类型注释,在其自己的初始化程序中直接或间接引用
- mysql - ubuntu linux集群复制配置中的水平分片方法
- php - 如何获取记录以求和一个值,然后添加到两个新表中?
- r - lapply 不使用我自己的变量
- python - 在python中创建一个“盒子”环境进行优化
- opencv - 调用 calibrateCamera 后如何获取单位长度的像素?
- javascript - HTML、Javascript、CSS 文本菜单
- php - shell_exec 在 Linux 服务器上不起作用
- ruby-on-rails - 如何在 ERB Do 语句中使用 CSS 类 Ruby on Rails