如何使用 java 8 流上的 foreach 循环进行迭代
假设我们尝试将一个可能引发已检查异常的 lambda 应用于 java 8 流:
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 循环,这对检查的异常更友好。forEach
但幼稚的方法失败了:
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>?作为侧面答案,并没有真正回答这个问题本身。我认为这不足以使这个问题成为那个问题的重复,因为他们问了不同的事情。