java-stream - 将 AutoCloseable、Iterable 类转换为 Stream
问题描述
StreamSupport.stream()
Stream
可以从一个创建一个Iterable
,但是如果这个类实现了Iterable
和AutoCloseable
呢?是否可以将该类转换为 aStream
并在 try-with-resources 块中构造它?
public class NonWorkingExample {
public static void main(final String[] args) {
// this won't call MyCursor.close()
try (Stream<String> stream = StreamSupport.stream(new MyCursor().spliterator(), false)) {
stream.forEach(System.out::println);
}
}
private static class MyCursor implements AutoCloseable, Iterable<String> {
public void close() throws Exception {
System.out.println("close");
}
public Iterator<String> iterator() {
List<String> items = new ArrayList<>();
items.add("foo");
items.add("bar");
items.add("baz");
return items.iterator();
}
}
}
解决方案
如javadoc 中所述,BaseStream.onClose()
“返回具有附加关闭处理程序的等效流”:
public class WorkingExample {
public static void main(final String[] args) {
MyCursor cursor = new MyCursor();
try (Stream<String> stream = StreamSupport.stream(cursor.spliterator(), false)
.onClose(cursor::close)) {
stream.forEach(System.out::println);
}
}
}
将MyCursor.close()
根据需要调用。
推荐阅读
- python - 如何根据 pd 数据框中的共享项对对进行分组?
- angular - 为什么我收到警告说我的全球版本比我的本地版本大。本地人从哪里来?
- excel - 基于单元格内容的 VBA 查找列
- typescript - Sequelize,Typescript 访问原始查询的结果
- python - 从终端窗口快速生成自定义合成音调序列的 Python 方法
- asp.net-core - ASP.NET Core 3.1 同时使用 OpenIDConnect 和自定义 Cookie 身份验证
- javascript - 如何在javascript中将“5px”添加到当前字体大小
- node.js - 如何在猫鼬中找到具有相同值的字段?
- python - Pytest:一一运行测试
- c# - 运行 windows 应用程序时出错,找不到 sgfplib.dll