【发布时间】:2014-11-05 21:56:50
【问题描述】:
我认为流 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());
}
}
我给出的例子没有任何意义。为了示例,我用Integer 将Path 替换为jpg 图像。但是不要让你被这些细节分散注意力。
使用这些自动关闭流的最佳方式是什么。 我不得不说我对我展示的 3 个选项中的任何一个都不满意。 你怎么看?还有其他更优雅的解决方案吗?
【问题讨论】:
-
你没有语法理由将 try 嵌套在 try 中。
标签: java java-8 java-stream