我认为流API在这里使代码更容易阅读.我发现了一些很烦人的东西.的Stream接口(java.util.stream.Stream)延伸的AutoClosable接口(java.lang.AutoCloseable)
因此,如果要正确关闭流,则必须使用try with resources.
清单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());
}
Run Code Online (Sandbox Code Playgroud)
清单2.2个imbricated尝试:(
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
清单3.当map返回流时,必须关闭stream()和map() …
是否stream.spliterator()隐式关闭stream,或者之后是否需要明确关闭它?
Stream<String> stream = Stream.of("a", "b", "c");
Spliterator<T> spliterator = stream.spliterator();
// Some low lever operation with the spliterator
stream.close(); // do we need to close?
Run Code Online (Sandbox Code Playgroud)
乍一看,似乎该.spliterator()方法关闭了stream,但没有调用stream.close().至少如果我在.spliterator()调用方法后立即将其关闭,似乎不会影响分裂器操作.
Stream<String> stream = Stream.of("a", "b", "c").limit(2);
Spliterator<T> spliterator = stream.spliterator();
stream.close();
// Some low lever operation with the spliterator
Run Code Online (Sandbox Code Playgroud)
这个问题可以扩展到其他stream方法,例如,.findAny().
stream.findAny() // Can I assume that I don't need to close the stream?
stream.onClose(() -> System.out.println("hi!")).findAny()`
// …Run Code Online (Sandbox Code Playgroud) 收集a时java.util.stream.Stream,为什么不void close()调用其方法?
大多数时候,学生会获得基于控制台的管理系统分配,即图书馆或销售点系统等.他们必须使用传统的文件系统存储他们的数据.
80-90%的时间他们错误地忘记在打开或创建文件后关闭文件.
someFile.close();
Run Code Online (Sandbox Code Playgroud)
(他们必须调试所有代码才能找到任何错误,为什么他们的数据没有存储在文件中.作为导师,我自己也经常遇到过这个问题.)
所以真实的是,这些高级语言尤其是Java强制执行异常处理的方式为什么没有任何东西可以强制执行文件关闭?