当前位置: 首页 > 知识库问答 >
问题:

Java 8平面映射流在try with resources块中关闭[重复]

史朗
2023-03-14

我有两个方法可以返回列表中字符串的长度,如下所示;

    private Stream<Integer> method1(List<String> list) {
        try (final Stream<String> myStream = list.stream()) {
            return myStream.map(String::length);
        }
    }

    private Stream<Integer> method2(List<String> list) {
        try (final Stream<String> myStream = list.stream()) {
            return myStream.map(String::length).flatMap(Stream::of);
        }
    }

当我尝试使用任何一种方法的结果流时;

    List<Integer> collect = method1(list).collect(Collectors.toList());

    List<Integer> collect = method2(list).collect(Collectors.toList());

我明白了

    Exception in thread "main" java.lang.IllegalStateException: source already consumed or closed

现在我意识到在尝试资源块中使用流并不常见。但在我的真实代码中,我使用Stream

这种方法必须在try-with-resources语句或类似的控制结构中使用,以确保流的操作完成后立即关闭流的打开目录。

上面的代码只是一个例子来说明这个问题。

我的问题是为什么我的流被关闭了,尽管我使用map平面地图来返回一个新流。我是否错误地期望这两个方法返回新的Stream实例,因此只有myStream被关闭,而不是从map操作返回的那个?我对单子有一个模糊的理解,但是map平面地图方法的行为意味着Stream不是一个真正的单子?


共有1个答案

甄正信
2023-03-14

一旦try块完成,将被关闭。

因为流

为什么我在块中创建的流实例也被关闭

因为在块中创建的新Stream实例是myStream的链式嵌套流,并且会在myStream(外流)关闭后立即关闭。您可以使用on关闭进行验证,如下所示,

privat Stream<Integer> method1(List<String> list) {
    try (final Stream<String> myStream = list.stream()) {
        Stream<Integer> integerStream = myStream.onClose(r)
                .map(String::length).onClose(r1);
        return integerStream;
    }
}
Runnable r = ()->{
    System.out.println("closed main stream...");
};
Runnable r1 = ()->{
    System.out.println("closed map stream...");
};
 类似资料:
  • 如果我执行以下“连接”两个流的代码 < li >首先通过平面映射< code >流 我在两种情况下都获得了相同的正确结果,但过滤操作的次数不同。 我在两种情况下都得到了预期的结果(3)。但是,第一个操作对集合的每个元素应用第一个过滤器,而第二个操作在遇到一个过滤器时就停止。输出是: 为什么两者之间的行为有所不同?JDK代码在第一个场景中是否可以改进为与第二个场景中一样高效,或者是否有一些东西使其不

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 问题内容: 我对java8流中和方法之间的区别感到困惑。例如, 我得到空的输出在这里,但如果我改变地图就像 我可以得到 {1 = 1,2 = 2} 为什么只是没有运行方法?它们之间有什么区别? 问题答案: 什么都不做,因为在执行终端操作之前不会处理流管道。因此,残留物为空。 在流管道中添加终端操作将导致针对终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素)

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 我所拥有的是, 我想要的是, 其中,