java BaseStream.close调用后,为什么put方法(Set类的)不起作用(set是外部变量)[重复]

pdkcd3nj  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(90)
    • 此问题在此处已有答案**:

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方法。

p8h8hvxi

p8h8hvxi1#

您的流中缺少一个终端操作符,因此它不会发生任何事情。
参见https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
中间操作返回一个新的流,它们总是懒惰的;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含初始流中与给定 predicate 匹配的元素。2管道源的遍历直到管道的终端操作执行完毕后才开始。
.collect是一个终端操作符,这解释了为什么当您将close替换为collect时,它可以正常工作。

相关问题