- 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!

InformationsquelleAutor gaijinco | 2014-06-17
Schreibe einen Kommentar