- Optional mit Streams in Java
Ich versuche umgestalten, einen alten code zu verwenden, streams, und mein Erster Ansatz war dieser:
public void run() throws IOException {
Files.list(this.source)
.filter(Images::isImage)
.map(Image::new)
.filter(image -> image.isProportional(this.height, this.width))
.map(image -> image.resize(this.height, this.width))
.forEach(image -> Images.write(image, this.destination));
}
Dies ist nicht zu kompilieren, da new Image() und Bilder.write() throws IOExceptions.
Wickeln diese Ausnahmen mit UncheckedIOException würde nicht den trick tun, als ich will nicht aufhören, andere Bilder werden verarbeitet, wenn eine von Ihnen ausfällt.
So beendete ich das schreiben 2 private Methoden:
private Optional<Image> createImage(Path imagePath) {
try {
return Optional.of(new Image(imagePath));
} catch (IOException e) {
return Optional.empty();
}
}
private void write(Image image) {
try {
Images.write(image, this.destination);
} catch (IOException e) {
//log error
}
}
createImage() gibt eine Optionale seit dieser scheint sinnvoll. Jedoch nach diesem meinen code bekam wirklich hässlich:
public void run() throws IOException {
Files.list(source)
.filter(Images::isImage)
.map(this::createImage)
.filter(image -> image.isPresent() && image.get().isProportional(this.height, this.width))
.map(image -> image.get().resize(this.height, this.width))
.forEach(this::write);
}
Gibt es eine Möglichkeit zu vermeiden, mit get() und isPresent() auf diesen code?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eines der schönen Dinge über Optionen ist, dass die Anwendung der Filterung, mapping und flat-mapping-Funktionen, die auf Ihnen nur auslösen, wenn der Optionale::isPresent wahr ist, also:
Ein anderer Weg ist, nur aufrufen, Optional::isPresent und Optional::get in separaten Strom-Transformationen:
Noch eine andere Möglichkeit (die ich weigere mich zu empfehlen als eine primäre Lösung, da seine relative Verrücktheit) ist eine änderung der statischen image-Erstellung-Methode in einen Strom generator, anstelle einer Optionalen generator, um die Vorteile von flatMap:
Auf den zweiten Gedanken, gehen Sie mit dieser Lösung; es scheint einfacher, und da die statische Methode ist, die privaten sowieso, weniger Schreien würde auftreten von Endnutzern, anderen Entwicklern, und zufällige Menschen Zugang zu einer angemessenen Java 8 decompilers (http://www.benf.org/other/cfr/).
Vom Java9, die Sie verwenden können
flatMap
undOptional::stream
zum filtern von leeren Optionals: