我认为流API可以使代码更易于阅读。
我发现有些烦人。 Stream接口(interface)扩展了java.lang.AutoCloseable接口(interface)。

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

list 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());
}

list 2.带有两个嵌套的try
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());
        }
    }
}

list 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());
    }
}

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

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

最佳答案

您正在使用@SuppressWarnings("resource"),它可能会禁止显示有关未关闭资源的警告。这不是javac发出的警告之一。 Web搜索似乎表明,如果未关闭AutoCloseable,则Eclipse会发出警告。
根据引入AutoCloseableJava 7 specification,这是一个合理的警告:

但是,放宽了AutoCloseableJava 8 specification,以删除“必须关闭”子句。现在部分说

Lambda专家组对此问题进行了广泛讨论。 this message总结了决定。它特别提到了对AutoCloseable规范(上面引用)和BaseStream规范(其他答案引用)的更改。它还提到了可能需要针对更改后的语义调整Eclipse代码检查器,以免不为AutoCloseable对象无条件发出警告。显然,此消息尚未传达给Eclipse员工,或者他们尚未更改。
总之,如果Eclipse警告使您认为需要关闭所有AutoCloseable对象,那是不正确的。仅某些特定的AutoCloseable对象需要关闭。需要修复Eclipse(如果尚未修复),以不对所有AutoCloseable对象发出警告。

07-24 09:19