Предположим, мы пытаемся применить к потоку 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 loop, который более дружелюбен к проверенным исключениям.
Но наивные подходы терпят неудачу:
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> ? как ответ на вопрос, который не отвечает на этот вопрос сам по себе. Я думаю, этого недостаточно, чтобы квалифицировать этот вопрос как дубликат этого, потому что они задают разные вещи.