我试图理解如何调用非终端流操作.
Stream.of("aaa", "bbb", "ccc")
.map(s -> {
System.out.println(s);
return s.toUpperCase();
});
//prints nothing
Stream.of("aaa", "bbb", "ccc")
.map(s -> {
System.out.println(s);
return s.toUpperCase();
})
.forEach(s -> {});
//prints "aaa" "bbb" "ccc"
这对我来说似乎很清楚.
第一个流没有以终端操作结束,因此它不会调用非终端操作,也不会打印任何内容.
Stream.of("aaa", "bbb", "ccc")
.map(s -> {
System.out.println(s);
return s.toUpperCase();
})
.findFirst();
//prints "aaa"
Stream.of("aaa", "bbb", "ccc")
.map(s -> {
System.out.println(s);
return s.toUpperCase();
})
.filter(s -> s.startsWith("B"))
.findFirst();
//prints "aaa" "bbb"
这就是我感到困惑的地方,尤其是最后一个.从某种意义上看,这条流是"向后"运行的.首先判断终端操作返回的元素,然后只对这些元素执行中间操作.但是如何解释最后一个呢?看起来它对所有元素进行了映射,直到与过滤器匹配的第一个元素.在最后一个例子中,如果我用forEach()
替换findFirst()
,它会打印所有元素,即使最后只有一个元素.
对我来说似乎有点违反直觉.谁能给我一个恰当的解释,流如何识别它应该执行中间操作的元素?