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
Vous devez vous connecter pour publier un commentaire.
Une des belles choses sur les Options c'est que l'application du filtrage, de la cartographie et de la plate-fonctions de cartographie sur eux ne se déclenchera que lorsque Facultatif::isPresent est vrai, donc:
Une autre façon est d'appeler uniquement en Option::isPresent et Facultatif::séparer les Flux de transformations:
Encore une autre façon (que je me refuse à le recommander comme une solution de premier choix en raison de sa relative étrangeté) est de changer l'image statique méthode de création dans un générateur de Flux, au lieu d'une Option de générateur, afin de profiter de flatMap:
Sur la deuxième pensée, aller avec cette solution, il semble être plus simple, et puisque la méthode statique est privé de toute façon, moins de cris de la fin les utilisateurs, les autres développeurs, et des gens au hasard avec un accès décent à Java 8 décompilation (http://www.benf.org/other/cfr/).
OriginalL'auteur srborlongan