我认为流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个选项都不满意。你怎么看?还有其他更优雅的解决方案吗?
您正在使用@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对象发出警告。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。