1. #1
    Rédacteur/Modérateur

    Avatar de Songbird_
    Homme Profil pro
    Bidouilleur
    Inscrit en
    juin 2015
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juin 2015
    Messages : 354
    Points : 2 612
    Points
    2 612
    Billets dans le blog
    3

    Par défaut Optional... avec quelques features en plus !

    Bonjour,

    Je vous propose un nouvel élément à utiliser : Optional... avec quelques features en plus !

    Fonctionnalités ajoutées:



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

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

    - La méthode getOrInsert() 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     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)));

    - La méthode getOrInsertWith() 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    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)));

    - 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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 Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    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<>())));



    Utilisation


    Il vous faudra utiliser maven 3 pour compiler et construire un jar puis exécuter simplement la commande:
    Code Bash : Sélectionner tout - Visualiser dans une fenêtre à part
    mvn clean install package

    Une fois fait, ajoutez le projet dans votre pom.xml:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <!-- ... -->
      <dependencies>
        <dependency>
          <groupId>fr.songbird.rapi</groupId>
          <artifactId>RAPI</artifactId>
          <version>0.1.0-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </project>


    C'est prêt !


    Note: 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.

    Note (1): Result n'est pas terminée et ne concerne pas cette contribution.

    Qu'en pensez-vous ?
    Avant de poster: FAQ Rust(WIP); FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !

    N'hésitez pas à contribuer ou nous faire part de vos retours !
    Release Rust FAQ #7


    Ninja Gaiden meets Metal.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 420
    Points : 24 849
    Points
    24 849
    Billets dans le blog
    2

    Par défaut

    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 - Visualiser dans une fenêtre à part
    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 - Visualiser dans une fenêtre à part
    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.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Rédacteur/Modérateur

    Avatar de Songbird_
    Homme Profil pro
    Bidouilleur
    Inscrit en
    juin 2015
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juin 2015
    Messages : 354
    Points : 2 612
    Points
    2 612
    Billets dans le blog
    3

    Par défaut

    Salut !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int value = Optional.of(42).map(x->x+1).orElse(-1);
    Ohw, effectivement, je ne savais même pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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().
    Avant de poster: FAQ Rust(WIP); FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !

    N'hésitez pas à contribuer ou nous faire part de vos retours !
    Release Rust FAQ #7


    Ninja Gaiden meets Metal.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 420
    Points : 24 849
    Points
    24 849
    Billets dans le blog
    2

    Par défaut

    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).
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 257
    Points : 48 310
    Points
    48 310

    Par défaut

    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
    David Delbecq Java developer chez HMS Industrial Networks AB.     LinkedIn | Google+

  6. #6
    Rédacteur/Modérateur

    Avatar de Songbird_
    Homme Profil pro
    Bidouilleur
    Inscrit en
    juin 2015
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juin 2015
    Messages : 354
    Points : 2 612
    Points
    2 612
    Billets dans le blog
    3

    Par défaut

    D'accord, entendu.
    Avant de poster: FAQ Rust(WIP); FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !

    N'hésitez pas à contribuer ou nous faire part de vos retours !
    Release Rust FAQ #7


    Ninja Gaiden meets Metal.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/12/2007, 09h30
  2. Réponses: 3
    Dernier message: 04/11/2007, 20h55
  3. Réponses: 1
    Dernier message: 11/05/2006, 11h19
  4. Réponses: 1
    Dernier message: 10/05/2006, 18h55
  5. [Struts] html:options avec deux Collections!
    Par Sniper37 dans le forum Struts
    Réponses: 5
    Dernier message: 15/06/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo