我认为流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());
}
}
我给出的例子没有任何意义。为了示例,我用
Path
将Integer
替换为jpg图像。但是,不要让您分散这些细节。处理这些自动关闭的流的最佳方法是什么。
我必须说,我对显示的3个选项都不满意。
你有什么感想?还有其他更优雅的解决方案吗?
最佳答案
您正在使用@SuppressWarnings("resource")
,它可能会禁止显示有关未关闭资源的警告。这不是javac
发出的警告之一。 Web搜索似乎表明,如果未关闭AutoCloseable
,则Eclipse会发出警告。
根据引入AutoCloseable
的Java 7 specification,这是一个合理的警告:
但是,放宽了AutoCloseable
的Java 8 specification,以删除“必须关闭”子句。现在部分说
Lambda专家组对此问题进行了广泛讨论。 this message总结了决定。它特别提到了对AutoCloseable
规范(上面引用)和BaseStream
规范(其他答案引用)的更改。它还提到了可能需要针对更改后的语义调整Eclipse代码检查器,以免不为AutoCloseable
对象无条件发出警告。显然,此消息尚未传达给Eclipse员工,或者他们尚未更改。
总之,如果Eclipse警告使您认为需要关闭所有AutoCloseable
对象,那是不正确的。仅某些特定的AutoCloseable
对象需要关闭。需要修复Eclipse(如果尚未修复),以不对所有AutoCloseable
对象发出警告。