IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Optional... avec quelques features en plus !

Fonctionnalités ajoutées:

- La méthode [codeinline]mapOr()[/codeinline]qui permet d'exécuter une méthode sur la valeur contenue ou de renvoyer une valeur par défaut si le conteneur est vide;
- La méthode [codeinline]mapOrElse()[/codeinline] qui permet d'exécuter une méthode sur la valeur contenue ou exécuter une méthode par défaut dans le cas où le conteneur serait vide;
- La méthode [codeinline]getOrInsert()[/codeinline] qui permet de récupérer la ressource d'un conteneur ou d'en insérer une s'il était vide tout en récupérant une référence de cette dernière;
[code=Java] ReferenceHandler < Option < String >> noneOption = new ReferenceHandler < > (new None < > ());
final String foo = noneOption.get().getOrInsert(noneOption, "foo");
assertThat(foo, is(equalTo("foo")));
assertThat(noneOption.get().getClass(), is(equalTo(Some.class)));[/code]
- La méthode [codeinline]getOrInsertWith()[/codeinline] qui permet de récupérer la ressource d'un conteneur ou d'en insérer une par le biais d'une méthode tout en récupérant une référence de cette nouvelle ressource;
[code=Java]final ReferenceHandler < Option < String >> noneOption = new ReferenceHandler < > (new None < > ());
final String foo = noneOption.get().getOrInsertWith(noneOption, () -> "foo");
assertThat(foo, is(equalTo("foo")));
assertThat(noneOption.get().getClass(), is(equalTo(Some.class)));[/code]
- La méthode take() qui permet littéralement de prendre la valeur d'un conteneur et la placer dans un autre, réinitialisant le premier conteneur à None.
[code=Java]Option < Integer > integer = new Some < > (117);
final ReferenceHandler < Option < Integer >> ref = new ReferenceHandler < > (integer);
final Option < Integer > anotherInteger = integer.take(ref);

assertThat(ref.get(), is(equalTo(new None < Integer > ())));
assertThat(anotherInteger, is(equalTo(new Some < > (117))));[/code]
[code=Java]
final Option < Integer > integer = new None < > ();
final ReferenceHandler < Option < Integer >> ref = new ReferenceHandler < > (integer);

assertThat(integer.take(ref), is(equalTo(new None < > ())));
assertThat(ref.get(), is(equalTo(new None < > ())));[/code]


[b]Utilisation[/b]

Il vous faudra utiliser maven 3 pour compiler et construire un jar puis exécuter simplement la commande: [code=Bash]mvn clean install package[/code]
Une fois fait, ajoutez le projet dans votre [codeinline]pom.xml[/codeinline]:
[code=XML]
...


fr.songbird.rapi
RAPI
0.1.0-SNAPSHOT
runtime


[/code]

C'est prêt !

[b]Note[/b]: C'est une snapshot mais les outils se trouvant dedans sont totalement stables (l'utilisant moi-même). Si vous avez des suggestions à propos du code (modifications, tricks, ...) n'hésitez pas à me le notifier ici ou vous pouvez également ouvrir une PR par ici.
[b]Note (1)[/b]: [codeinline]Result[/codeinline] n'est pas terminée et ne concerne pas cette contribution.
Nos ressources disponibles
Avatar de joel.drigo
Modérateur https://www.developpez.com
Le 25/09/2017 à 23:27
Salut,

Citation Envoyé par Songbird_ Voir le message

- La méthode mapOr()qui permet d'exécuter une méthode sur la valeur contenue ou de renvoyer une valeur par défaut si le conteneur est vide;
Existe déjà (exemple absurde(!)) :

Code : Sélectionner tout
int value = Optional.of(42).map(x->x+1).orElse(-1);
Citation Envoyé par Songbird_ Voir le message

- La méthode mapOrElse() qui permet d'exécuter une méthode sur la valeur contenue ou exécuter une méthode par défaut dans le cas où le conteneur serait vide;
Existe en Java 9 (exemple absurde(!)) :
Code : Sélectionner tout
Optional.of(42).ifPresentOrElse(System.out::println, ()->System.out.println("Pas de valeur !"));
Quant aux autres, je trouve qu'elles bafouent le principe fonctionnel de Optional.
Avatar de Songbird
Membre expert https://www.developpez.com
Le 01/10/2017 à 13:37
Salut !
Code : Sélectionner tout
int value = Optional.of(42).map(x->x+1).orElse(-1);
Ohw, effectivement, je ne savais même pas.
Code : Sélectionner tout
1
2
Optional.of(42).ifPresentOrElse(System.out::println, ()->System.out.println("Pas de valeur !"));
Ça c'est vraiment pas mal par contre, ça manquait clairement à la classe.

Quant aux autres, je trouve qu'elles bafouent le principe fonctionnel de Optional.
Pourquoi ?

En soit, je les trouve plutôt utiles pour simuler un changement d'état (e.g. si un flag du programme devait être désactivé sous certaines conditions et que le reste de la mécanique devait en être informé). Toutefois, ces méthodes venant tout droit de la structure Option de Rust, il y a certaines limites que Java ne peut pas franchir notamment pour modifier l'état de l'instance courante ce qui rend l'utilisation de ces méthodes un peu... étrange, puisqu'il faut passer une référence de l'objet courant (et si ce n'est pas l'objet courant, bah ça ne change rien, donc ça pourrait être une source d'erreur) pour le modifier. La méthode ne peut pas le faire d'elle-même.

cf. les sources la méthode take().
Avatar de joel.drigo
Modérateur https://www.developpez.com
Le 02/10/2017 à 16:50
Citation Envoyé par Songbird_ Voir le message
changement d'état
Justement. Tout est dit : changement d'état. Les classes Stream et Optional cherchent à introduire le paradigme fonctionnel dans Java. Réintroduire la notion de machine à états est donc un contournement. (NB: je ne cherche pas à dire lequel du paradigme impératif ou fonctionnel est le mieux, c'est un autre débat, je dis simplement que Optional n'a pas été conçu pour ça, d'où l'attribut final).
Avatar de tchize_
Expert éminent sénior https://www.developpez.com
Le 02/10/2017 à 22:30
Tout a fait d'accord, un Optional doit être vu comme une chose Immuable, une valeur, juste protégée des NPEs. C'est comme Integer, BigDecimal, String, ... La valeur change? la référence doit changer
Avatar de Songbird
Membre expert https://www.developpez.com
Le 03/10/2017 à 13:23
D'accord, entendu.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.