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

Langage Java Discussion :

Tutoriel pour développer un Switch/Case en programmation fonctionnelle avec Java 8


Sujet :

Langage Java

  1. #1
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 73 024
    Points
    73 024
    Par défaut Tutoriel pour développer un Switch/Case en programmation fonctionnelle avec Java 8
    Bonjour,

    François-Xavier Robin nous propose une façon d'écrire en Java 8 le switch/case en programmation fonctionnelle en s’appuyant sur des lambdas.

    Pour consulter le tutoriel : https://fxrobin.developpez.com/tutor...fonctionnelle/

    N'hésitez pas à laisser des commentaires à la suite.

    Mickael BARON pour l'équipe Java de Developpez.com

    Retrouvez les meilleurs cours et tutoriels pour apprendre le développement avec le langage Java
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Ingénieur de Recherche en informatique au LIAS / ISAE-ENSMA
    Page de Developpez.com : mbaron.developpez.com
    Twitter : www.twitter.com/mickaelbaron
    Blog : mickael-baron.fr
    LinkedIn : www.linkedin.com/in/mickaelbaron
    DBLP : dblp.uni-trier.de/pers/hd/b/Baron:Micka=euml=l

  2. #2
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 604
    Points
    5 604
    Par défaut
    Bien que je développe plus en Java depuis de nombreuses années, je trouve ton implémentation intéressante et très instructive....
    ...

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Très bel exercice intellectuel.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    A la fois intéressant et utile. Un problème récurrent que j'ai eu avec la programmation fonctionnelle en Java est qu'elle devient illisible quand la logique implique des branchements complexes, voilà une bonne solution.

    Je modifierai SwitchExpression pour qu'elle étende Function. On pourrait ainsi s'en servir facilement avec Stream.map. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    List<String> reports = codes.stream()
        .map(
            Switch.defaultCase(code -> "Unknwown code " + code)
                .single(0, code -> "Success")
                // ...
                .build())
        .collect(Collectors.toList());

  5. #5
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Bonjour, et merci à vous tous pour vos retours positifs, ça fait plaisir.

    Citation Envoyé par BugFactory Voir le message
    Je modifierai SwitchExpression pour qu'elle étende Function. On pourrait ainsi s'en servir facilement avec Stream.map. Par exemple
    Merci pour cette idée, que je vais prendre en compte immédiatement.

    Disons que l'interface SwitchExpression était là aussi pour illustrer la pratique des différentes étapes (et états) quand on fait du method-chaining.

    Voici les modifs apportées (visibles sur GitHub, pas dans l'article):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface SwitchExpression <T, R> extends Function<T, R>
    {
       // unchanged
    }
    implémentation dans la classe Switch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public R apply(T value)
    {
       return resolve(value);
    }
    et le test de son bon fonctionnement, ce qui a été le plus long à écrire ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    @Test
    public void StreamMapTest()
    {
            // switcher could have been written in the map method of the Stream.of(), 
            // but it's defined here for readability only.
            SwitchExpression<Integer, String> switcher = Switch.<Integer, String> start()
                                                               .defaultCase(v -> "ODD")
                                                               .predicate(v -> v % 2 == 0, v -> "EVEN")
                                                               .build();
     
            // just to check thats everything is fine
            assertNotNull(switcher, "cannot build the switcher");
     
            // let's run the Stream.map which will call the switcher.
            // the switcher implements Function <R, T> and its apply(T t) method.
            List<String> result = Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
                                        .map(switcher)
                                        .collect(Collectors.toList());
     
            // few tests on the list
            assertNotNull(result, "the returned list is null, which is unacceptable!");
            assertEquals(10, result.size(), "the returned list size is wrong, which is totally unacceptable!");
     
            // then lets count the EVEN and the ODD to verify the switcher behavior inside a Stream.map().
     
            Map<String, Long> statistics = result.stream().collect(Collectors.groupingBy(String::toString, Collectors.counting()));
     
            assertNotNull(statistics, "the returned map is null, which is unbelievable!");
            assertEquals(5L, statistics.get("ODD").longValue());
            assertEquals(5L, statistics.get("EVEN").longValue());
     
            // it's working!
    }

    Je ferai une mise à jour de mon article sur mon blog directement :
    https://www.fxjavadevblog.fr/functional-switch/


    Merci encore pour cette belle idée !

    F.X.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2017, 17h03
  2. [Joomla!] un excellent tutoriel pour développement de composant
    Par cool dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/08/2011, 21h23
  3. Réponses: 3
    Dernier message: 30/07/2008, 10h21

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