Hm, naja, bei so kurzen Ausdrücken ist das Geschmackssache, kann man tun, muss man nicht. Und eigentlich will man etwas leicht anderes, und zwar die Funktionalität zwischen dem try-catch abstrahieren. Angenommen wir bleiben bei deinem Beispiel und bekommen von irgendwoher einen FileWriter. Dann könnte die erste Maßnahme wie folgt aussehen:
[code=Java]
public class IDontKnow {
@FunctionalInterface
private interface ConsumerWithEx<T> {
void accept(T t) throws Exception;
}
FileWriter fwriter;
private static <T> Consumer<T> toUnchecked(ConsumerWithEx<T> consumer){
return (T arg) -> {
try {
consumer.accept(arg);
} catch (IOException e) {
throw new UncheckedIOException(e);
} catch (Exception e) {
throw new RuntimeException(e);
} catch (Throwable t){
throw t;
}
};
}
public IDontKnow() {
Consumer<String> appendToFile = toUnchecked(fwriter::write);
Arrays
.stream(new String[]{"a", "b", "c", "d"})
.forEach(appendToFile::accept);
}
}
[/code]
Und falls wirklich noch mehr hinzukommt als nur das Schreiben der Zeile, vll. eine Validierung etc. kann man dann so wie du eine weitere Methode einführen.
[code=Java]
public IDontKnow() {
//Consumer<String> appendToFile = toUnchecked(fwriter::write);
Consumer<String> appendToFile = toUnchecked(this::appendToFile);
Arrays
.stream(new String[]{"a", "b", "c", "d"})
.forEach(appendToFile::accept);
}
private void appendToFile(String text) throws IOException {
//mach dies
fwriter.write(text);
//mach jenes
}
[/code]
Aber man sieht das bei der Verwendung von Lambda-Ausdrücken darauf geachtet werden sollte das keine checked Exceptions verwendet werden, es ist einfach hakelig und unschön.