【发布时间】:2020-01-04 15:21:57
【问题描述】:
我似乎无法理解 Java 如何将流操作组合到流管道中。
执行以下代码时
public
static void main(String[] args) {
StringBuilder sb = new StringBuilder();
var count = Stream.of(new String[]{"1", "2", "3", "4"})
.map(sb::append)
.count();
System.out.println(count);
System.out.println(sb.toString());
}
控制台只打印4。 StringBuilder 对象的值仍然是 ""。
当我添加过滤操作时:filter(s -> true)
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
var count = Stream.of(new String[]{"1", "2", "3", "4"})
.filter(s -> true)
.map(sb::append)
.count();
System.out.println(count);
System.out.println(sb.toString());
}
输出变为:
4
1234
这个看似多余的过滤器操作如何改变组合流管道的行为?
【问题讨论】:
-
有趣!!!
-
我想这是特定于实现的行为;可能是因为第一个流的大小已知,而第二个流没有,大小决定了是否执行中间操作。
-
出于兴趣,如果你反转过滤器和映射会发生什么?
-
在 Haskell 中进行了一些编程,闻起来有点像这里正在进行的一些懒惰的评估。谷歌搜索返回,流确实有些懒惰。可能是这样吗?并且没有过滤器,如果java足够聪明,就不需要实际执行映射。
-
@AndyTurner 它给出了相同的结果,即使是反转
标签: java java-stream