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

Collection et Stream Java Discussion :

L'API stream en JAVA 8


Sujet :

Collection et Stream 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 L'API stream en JAVA 8
    Bonjour,

    J'ai 2 questions à propos l’utilisation de l'API Stream:

    Question 1:

    Je voulais retourner l'ensemble des employés qui sont présents, en tenant compte que dans la classe Employe, j'ai les gettes et les setters qui sont implémentés!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public List<Employe> employesPresents(){
            return participants.values().stream()
                            .map(f->{
                                List<Employe> li = new ArrayList<>();
                                for(Employe e : f){
                                    if(e.isPresent())
                                           li.addAll(e);
                                }
                                return li;
                            })  
                            .collect(Collectors.toList());
        }
    le problème c'est que j'ai une erreur de compilation au niveau de la dernière instruction (collect(Collectors.toList()) ..... même si je la remplace avec la méthode count(), je reçois toujours 1 alors que j'ai mis 3 employes dont l'attribut present est true!!!

    NB: Je ne veut pas utiliser la méthode reduce


    Question 2:

    Quand une méthode retourne un objet de type "stream", c'est qu'on va manipuler les éléments de ce stream un par un ou bien on parle de tout un bloc?!

    Merci pour votre réponse en avance

  2. #2
    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,


    Question 1:
    Ton map retourne des List<Employe>, donc si tu ajoutes cela dans une liste çà donne une List<List<Employe>>, ce qui ne correspond pas à ton type de retour (d'où l'erreur probablement)

    Quel est le type exact de "participants" ? Que comporte-t-il ? Et que veux-tu obtenir exactement en retour ?
    Difficile de t'aider sans connaître cela.

    NB : le problème ce n'est pas de savoir ce que tu veux utiliser, mais ce que tu veux faire...

    Question 2:

    Je ne suis pas sûr de comprendre la question.
    Le Stream ne peut être utilisé qu'une seule fois, et il va manipuler les éléments selon les critères que tu auras utilisé...

    Que veux-tu dire par "un par un" ou "par bloc" précisément ?

  3. #3
    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
    1- participants est une HashMAP<String, Set<Employee>>

    - Je veux obtenir la liste des employes qui sont présents (isPresent() == true)

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Et si tu utilisais directement la méthode filter sur ton stream puis ton collect ?
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return participants.values().stream().filter(e -> e.isPresent()).collect(Collectors.toList());

  5. #5
    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
    Citation Envoyé par L'aigle de Carthage Voir le message
    1- participants est une HashMAP<String, Set<Employee>>
    Dans ce cas participants.values().stream() te retourne un Stream<Set<Employee>>.

    Je suppose que tu veux regrouper les différents employé de chaque Set<> dans la une seule liste finale ?
    Dans ce cas il faut utiliser flatMap() pour transformer cela en un Stream<Employe>

    Tu pourras ensuite utiliser filter() pour ne conserver que les employés présent, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public List<Employe> employesPresents(){
    	return participants.values().stream()
    		.flatMap(Set::stream)
    		.filter(Element::isPresent)
    		.collect(Collectors.toList());
    }

    Si tu veux en plus éviter de potentiel doublons, il faudrait soit retourner un Set soit utiliser la methode distinct()...

Discussions similaires

  1. [Avis] Quelles sont les meilleures API et outils Java ?
    Par Mickael Baron dans le forum API standards et tierces
    Réponses: 33
    Dernier message: 08/06/2011, 14h39
  2. [DOM] API DOM de Java
    Par papus1984 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 30/01/2007, 14h06
  3. [API] COM pour java
    Par JFDelges dans le forum Général Java
    Réponses: 4
    Dernier message: 15/03/2006, 10h16
  4. [Windows]Api win32 pour java
    Par cpanette dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 27/06/2005, 15h06
  5. [Logging]API Logging de Java
    Par trainscoding dans le forum Logging
    Réponses: 6
    Dernier message: 17/01/2005, 15h21

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