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

avec Java Discussion :

Méthode avec Java 8


Sujet :

avec Java

  1. #1
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut Méthode avec Java 8
    Bonsoir,

    j'ai la déclaration suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        public Map<Medecin,ListPatients> blocmedecin = new HashMap<>();;
    et j'ai la méthode RetournerNomPatients qui permet de Retourner les noms des patients dont le numSecuriteSociale = 10, définie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    return blocmedecin.values()
           .stream().map(e->e.getListP()).
                   reduce((l1,l2)->{
                       l1.addAll(l2); 
                       return l1;
                               }).get().stream().
                   filter(e->e.getNumSecuriteSociale()==10).
                   map(e->e.getNom()).collect(Collectors.toList());
    Je me demande c'est quoi l'utilité de la fonction reduce() et la fonction get() dans ce cas?

    Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    On va faire dans l'ordre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    blocmedecin.values()   // Collection<ListPatients>
           .stream().map(e->e.getListP()). // Collection<List<Patient>> à priori
                   reduce((l1,l2)->{
                       l1.addAll(l2); 
                       return l1;
                               }) //Optional<List<Patient>> contenant tous les patients**
    .get()  // List<Patient>
    .stream().filter(e->e.getNumSecuriteSociale()==10). // on prend les 10
    map(e->e.getNom()) // on prends les noms
    .collect(Collectors.toList()); // on en fait une liste
    ** ce reduce tel que fait est dangereux, il nique la liste patient du médecin en y mettant le contenu des listes patients des autres médecin, tu ne devrais pas toucher cette liste, sauf si getListP() retourne une nouvelle liste à chaque fois. A noter qu'on peux rendre plus lisible et un peu plus propre le code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    return blocmedecin.values().stream()
           .map(ListPatients::getListP())
           .reduce(new ArrayList<Patient>(),(l1,l2)->{l1.addAll(l2); return l1;})
           .stream().filter(e->e.getNumSecuriteSociale()==10)
           .map(Patient::getNom())
           .collect(Collectors.toList());

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par tchize_ Voir le message
    ** ce reduce tel que fait est dangereux, il nique la liste patient du médecin en y mettant le contenu des listes patients des autres médecin, tu ne devrais pas toucher cette liste, sauf si getListP() retourne une nouvelle liste à chaque fois.

    Attention car même là le reduce() n'est pas correct.
    Il devrait être stateless et donc ne pas dépendre ou modifier un de ses paramètres.
    Dans l'exemple cela "fonctionne" parce qu'on est en séquentielle, mais en parallèle cela pourrait poser des problèmes...

    En théorie le reduce() devrait plutôt correspondre à ceci et retourner une valeur distincte de ses paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                .reduce(new ArrayList<>(), (l1,l2) -> {
                    List<Patient> list = new ArrayList<>(l1.size() + l2.size());
                    list.addAll(l1);
                    list.addAll(l2);
                    return list;
                })




    Mais c'est surtout une mauvaise utilisation de reduce() !!!
    reduce() sert à obtenir une réduction à un seul élément à partir d'un flux. C'est bien pour faire des sommes ou des trucs du genre, mais pas pour créer une collection (où on utiliserait plutôt collect).

    Ici ce qu'on cherche à faire c'est de passer d'un Stream<List<Patient>> à un Stream<Patient> contenant tous les éléments distincts...
    Et pour cela il faut utiliser flatMap() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            return blocmedecin.values().stream() 
                    .map(ListPatients::getListP)
                    .flatMap(Collection::stream)
                    .filter(e->e.getNumSecuriteSociale()==10)
                    .map(Patient::getNom)
                    .collect(Collectors.toList());

    Et c'est théoriquement plus performant car on n'a pas à créer une collection contenant tous les patients...


    a++

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2010, 16h13
  2. javascript vers java (méthodes avec paramètres)
    Par knice dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/08/2008, 22h42
  3. Réponses: 5
    Dernier message: 07/06/2007, 18h47
  4. Problème avec les méthodes en JAVA
    Par beegees dans le forum Langage
    Réponses: 9
    Dernier message: 04/02/2007, 21h19
  5. méthode avec valeur objet en parametre en java
    Par ché dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2006, 10h52

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