假设我们尝试应用于
java 8流一个可以抛出异常的lambda:
Stream 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);
}
});
替代解决方法可能是将limited功能转换为plain old foreach loop,这对于检查异常更为友好.
但天真的方法失败了:
for (String s : stream) { // for-each not applicable to expression type 'java.util.stream.Stream'
writer.append(s);
}
for (String s : stream.iterator()) { // foreach not applicable to type 'java.util.Iterator'
writer.append(s);
}
更新
回答这个问题的一个技巧就是在Why does Stream not implement Iterable?作为side answer发布,并没有真正回答这个问题.
我认为这是不够的,因为他们问不同的事情,这个问题是重复的.