En Option avec des Flux en Java

J'essayais de revoir un vieux code à utiliser les flux, et ma première approche a été ceci:

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));
}

Ce n'est pas la compilation depuis new Image() et des Images.write() throws IOExceptions.

Emballage de ces exceptions avec UncheckedIOException ne ferais pas le truc que je ne veux pas arrêter d'autres images à traiter si l'un d'entre eux tombe en panne.

Alors j'ai fini l'écriture de 2 méthodes privées:

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() retourne une Option puisque cela semble raisonnable. Cependant, après ce que mon code s'est vraiment laid:

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);
}

Est-il un moyen d'éviter l'utilisation de get() et isPresent() sur ce code?

Merci!

OriginalL'auteur gaijinco | 2014-06-17