首页 > 解决方案 > 将 AutoCloseable、Iterable 类转换为 Stream

问题描述

StreamSupport.stream()Stream可以从一个创建一个Iterable,但是如果这个类实现了IterableAutoCloseable呢?是否可以将该类转换为 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();
        }
    }
}

标签: java-streamautocloseable

解决方案


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()根据需要调用。


推荐阅读