- 此问题在此处已有答案**:
Java 8 Streams peek/map without collecting is not giving output(2个答案)
16小时前关门了。
[1]案例1
package programmers.튜플;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void printEvenWithDebug() {
Set<Integer> testSet= new HashSet<>();
List.of("1","2", "3").stream().map((item)->{
testSet.add(Integer.valueOf(item));
return Integer.valueOf(item);
}).close();
System.out.println("testSet ------");
testSet.forEach((item)-> System.out.println("item = " + item));
}
public static void main(String[] args) {
printEvenWithDebug();
}
}
结果是这样的。
输出
晚上9:10:30:正在执行":Test. main()"...
\〉任务:编译Java
\〉任务:进程资源无源
\〉任务:类
\〉任务:测试main()
测试集------
但是,我期望testSet将有1,2,3个元素.但它没有
[2]案例二
然后我把close()方法改为
collect(Collectors.toList())
而且...它和我预期的一样工作
(产出)
9:29:55 PM:正在执行":Test. main()"...
\〉任务:编译Java
\〉任务:进程资源无源
\〉任务:类
\〉任务:测试main()
测试集------
项目= 1
项目= 2
项目= 3
-———————————————-
[3]但我不知道为什么会这样
还有谁能告诉我为什么会发生这种事吗?
如果可以的话,我想要一些正式的文档链接(如www.example.com或https://www.baeldung.com/等)。docs.oracle.com or https://www.baeldung.com/ etc.. )
我上面提到的,我试过谷歌搜索(但我什么也找不到),或者用collect(Collectors. toList())改变close方法。
1条答案
按热度按时间p8h8hvxi1#
您的流中缺少一个终端操作符,因此它不会发生任何事情。
参见https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html:
中间操作返回一个新的流,它们总是懒惰的;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含初始流中与给定 predicate 匹配的元素。2管道源的遍历直到管道的终端操作执行完毕后才开始。
.collect
是一个终端操作符,这解释了为什么当您将close
替换为collect
时,它可以正常工作。