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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Codes sources à télécharger Java Discussion :

Optional... avec quelques features en plus !


Sujet :

Codes sources à télécharger Java

  1. #1
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    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; 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 !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    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.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    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
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    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; 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 !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    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).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    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 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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

  6. #6
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    D'accord, entendu.
    Avant de poster: FAQ Rust; 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 !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

Discussions similaires

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

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