假设我们尝试应用一个可能会抛出已检查异常的 lambda 到 Java 8 Stream 中:
Stream<String> stream = Stream.of("1", "2", "3");
Writer writer = new FileWriter("example.txt");
stream.forEach(s -> writer.append(s)); // Unhandled exception: java.io.IOException
这段代码无法编译。
一种解决方法是将已检查异常嵌套在RuntimeException
中,但这会使以后的异常处理变得复杂且难看:
stream.forEach(s -> {
try {
writer.append(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
替代方法可能是将有限制的函数式forEach
转换为更友好于可检查异常的旧式for循环循环。
但是,简单的方法会失败:
for (String s : stream) { // for-each not applicable to expression type 'java.util.stream.Stream<java.lang.String>'
writer.append(s);
}
for (String s : stream.iterator()) { // foreach not applicable to type 'java.util.Iterator<java.lang.String>'
writer.append(s);
}
更新
之前在为什么Stream<T>没有实现Iterable<T>?上发布了一个技巧旁边的回答,它并没有真正回答这个问题本身。我认为这还不足以将此问题归类为那个问题的重复,因为它们询问的是不同的内容。
Stream
到Iterable
转换实际问题更实用。 - Vadzim