开发者社区> 问答> 正文

Java 8 Streams并尝试使用资源

我认为流API可以使代码更易于阅读。我发现很烦人。该Stream接口扩展java.lang.AutoCloseable接口。

因此,如果要正确关闭流,则必须对资源使用try。

清单1。不是很好,流没有关闭。

public void noTryWithResource() {
    Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));

    @SuppressWarnings("resource") List<ImageView> collect = photos.stream()
        .map(photo -> new ImageView(new Image(String.valueOf(photo))))
        .collect(Collectors.<ImageView>toList());
}

清单2。有2个嵌套尝试

public void tryWithResource() {
    Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));

    try (Stream<Integer> stream = photos.stream()) {
        try (Stream<ImageView> map = stream
                .map(photo -> new ImageView(new Image(String.valueOf(photo)))))
        {
            List<ImageView> collect = map.collect(Collectors.<ImageView>toList());
        }
    }
}

清单3。当map返回流时,必须关闭stream()和map()功能。


public void tryWithResource2() {
    Set<Integer> photos = new HashSet<Integer>(Arrays.asList(1, 2, 3));

    try (Stream<Integer> stream = photos.stream(); Stream<ImageView> map = stream.map(photo -> new ImageView(new Image(String.valueOf(photo)))))
    {
        List<ImageView> collect = map.collect(Collectors.<ImageView>toList());
    }
}

我给出的例子没有任何意义。为了示例,我将替换Path为jpg图像Integer。但是,不要让您分散这些细节。

处理这些自动关闭的流的最佳方法是什么。我必须说,我对显示的3个选项都不满意。你怎么看?还有其他更优雅的解决方案吗?

展开
收起
垚tutu 2019-12-12 09:45:56 828 0
1 条回答
写回答
取消 提交回答
  • #include

    您正在使用@SuppressWarnings("resource")它来禁止显示有关未关闭资源的警告。这不是发出的警告之一javac。Web搜索似乎表明,如果AutoCloseable未关闭,Eclipse会发出警告。

    根据引入的Java 7规范,这是一个合理的警告AutoCloseable:

    在不再需要时必须关闭的资源。

    然而,Java的8规范的AutoCloseable很轻松删除“必须关闭”的条款。现在部分说

    一个可能拥有资源的对象,直到关闭。

    即使并非所有子类或实例都拥有可释放的资源,基类也有可能并且实际上是常见的。对于必须完全通用的代码,或者已知AutoCloseable实例需要释放资源的代码,建议使用try-with-resources构造。但是,当使用诸如Stream的功能同时支持基于I / O和基于非I / O的形式时,使用非基于I / O的形式时通常不需要使用资源尝试模块。

    Lambda专家组对此问题进行了广泛讨论。此消息总结了决定。除其他事项外,它提到对AutoCloseable规范(上文引用)和BaseStream规范(由其他答案引用)的更改。它还提到可能需要针对更改后的语义调整Eclipse代码检查器,以免不为AutoCloseable对象无条件发出警告。显然,此消息尚未传达给Eclipse员工,或者他们尚未更改。

    总之,如果Eclipse警告使您认为您需要关闭所有AutoCloseable对象,那是不正确的。仅某些特定AutoCloseable对象需要关闭。Eclipse需要修复(如果尚未修复),不要对所有AutoCloseable对象发出警告。

    2019-12-12 09:46:05
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载