Stream的Javadoc状态:
流具有BaseStream.close()方法并实现AutoCloseable,但是实际上几乎所有流实例在使用后都不需要关闭。通常,只有源是IO通道的流(例如,由Files.lines(Path,Charset)返回的流)才需要关闭。大多数流都由集合,数组或生成函数支持,而无需特殊的资源管理。 (如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。)
因此,绝大多数情况下,人们可以像collection.stream().forEach(System.out::println);
这样使用单行流,但对于Files.lines
和其他资源支持的流,则必须使用try-with-resources语句,否则会泄漏资源。
这让我感到容易出错且不必要。由于Streams只能被迭代一次,所以在我看来,不存在Files.lines
的输出不应在被迭代后立即关闭的情况,因此,实现应仅在任何终端的末尾隐式调用close。操作。我错了吗
参考方案
是的,这是一个蓄意的决定。我们考虑了两种选择。
这里的操作设计原则是“谁获取资源都应该释放资源”。当您读到EOF时,文件不会自动关闭;我们希望文件被打开者明确关闭。 IO资源支持的流是相同的。
幸运的是,该语言为您提供了一种自动化的机制:try-with-resources。由于Stream实现了AutoCloseable,因此您可以执行以下操作:
try (Stream<String> s = Files.lines(...)) {
s.forEach(...);
}
“自动关闭真的很方便,因此我可以将它写成单线”这样的说法很好,但主要是尾巴摇动了狗。如果您打开了文件或其他资源,则还应该准备关闭它。有效和一致的资源管理胜过“我想一行编写”,而我们选择不失真设计只是为了保持一行式。
JAVA 8具有任何匹配属性的对象的过滤器列表 - java我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…
检查Optional中是否存在null属性,并返回String Java Stream API - java我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…
Java 8流:处理空值 - java以下代码为属性Salary为null抛出NPE。class Person具有以下属性:字符串:name,整数:age,整数:薪金salary在此处可以为null。我想创建一份工资清单。persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())在这里,…
Java 8 Stream从过滤结果中获取对象 - java注意:我不知道我的标题是否正确,所以请随时将其更改为更合适的名称,因为Java 8的术语是我的新手。问题:我有一些对象A,我想根据它持有的数值(例如整数)对其进行过滤。我想找到具有最高值的对象,然后返回该对象。使用流如何完成?public SomeObject getObjectWithHighestValue() { int max = Integer.M…
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …