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

Java Discussion :

Probleme recuperation List depuis un Stream


Sujet :

Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 703
    Points : 934
    Points
    934
    Par défaut Probleme recuperation List depuis un Stream
    Bonjour

    J'ai le code suivant qui fonctionne, mais je ne suis pas satisfait de la maniere dont je recupere la liste dans mon Stream ou je suis obligé de mettre cela dans un objet !
    J'aurais souhaité faire un
    List<DtoCompte> tmpLst = billingSummary.stream(). ..... et supprimer le return tmpLst.add
    Le but de ce stream est de grouper sur 3 champs
    Merci


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     List<DtoCompte> tmpLst = new ArrayList<DtoCompte>();
                billingSummary.stream().collect(Collectors
                        .groupingBy(p -> List.of(
                                p.getNumeroFacture(),
                                p.getNumeroCompte(),
                                p.getDate())
                                , toList()
                        )
                ).entrySet().stream()
                        .collect(Collectors.toMap(x -> {
                            BigDecimal qte = x.getValue().stream().map(DtoCompte::getQuantite).reduce(BigDecimal.ZERO, BigDecimal::add);
                            BigDecimal total = x.getValue().stream().map(DtoCompte::getTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
                            return tmpLst.add(new DtoCompte(x.getValue().get(0).getNumeroCompte(), x.getValue().get(0).getPayeur(), x.getValue().get(0).getDate(), x.getValue().get(0).getNumeroFacture(), qte, total));
                        }, Map.Entry::getValue)).values().stream().collect(Collectors.toList());
     
                billingSummary = tmpLst;
     
     
     
    _________________________________________________________________________________			
     
    			public class DtoCompte {
     
        private final String numeroCompte;
        private final String payeur;
        private final LocalDate date;
        private final String numeroFacture;
        private final BigDecimal quantite;
        private final BigDecimal total;
        @Setter
        private boolean alreadyMatched;
     
        public DtoCompte(String numeroCompte, String payeur, LocalDate date, String numeroFacture,
                BigDecimal quantite, BigDecimal total) {
     
            this.numeroCompte = numeroCompte;
            this.payeur = payeur;
            this.date = date;
            this.numeroFacture = numeroFacture;
            this.quantite = quantite;
            this.total = total;
        }
     
        public DtoCompte(VueItemCommandeForEtatDeCompte vueItemCommandeForEtatDeCompte) {
     
            this.numeroCompte = vueItemCommandeForEtatDeCompte.getNumeroCompte();
            this.payeur = vueItemCommandeForEtatDeCompte.getPayeur();
            this.date = vueItemCommandeForEtatDeCompte.getDateFacture();
            this.numeroFacture = vueItemCommandeForEtatDeCompte.getNumeroFacture();
            this.quantite = vueItemCommandeForEtatDeCompte.getQuantite();
            this.total = vueItemCommandeForEtatDeCompte.getTotal();
        }
     
        public LocalDate getDate() {
            return date;
        }
     
        public String getPayeur() {
            return payeur;
        }
     
        public String getNumeroFacture() {
            return numeroFacture;
        }
     
        public BigDecimal getQuantite() {
            return quantite;
        }
     
        public BigDecimal getTotal() {
            return total;
        }
     
        public String getNumeroCompte() {
            return numeroCompte;
        }
     
        public boolean hasSameFacture(DtoCompte other) {
            return other != null && equalsIgnoreCase(numeroFacture, other.numeroFacture) && Objects
                    .equals(date, other.date);
        }
     
        public boolean hasSameBillingInfo(DtoCompte other) {
            return other != null && quantite.compareTo(other.quantite) == 0 && total.compareTo(other.total) == 0
                    && equalsIgnoreCase(stripAccents(payeur), stripAccents(other.payeur));
        }
     
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 545
    Points : 21 601
    Points
    21 601
    Par défaut
    Hello,

    ouais honnêtement je vois pas comment faire une réduction de ce genre simplement. 'Faudrait créer une classe pour la clé de groupage et une classe pour l'accumulation des sommes.

    En suivant ton système (faire des List pour la clé de groupage, et construire une Map d'abord et la réduire ensuite), je dirais qu'il faut :

    - utiliser values() au lieu d'entrySet(). La clé de groupage a joué son rôle, maintenant tu n'as besoin que des groupes individuels
    - utiliser map(), pas collect(). Pour chaque groupe tu veux le réduire en un DtoCompte unique, mais à la fin tu veux une List qui contient le DtoCompte correspondant à chaque groupe. C'est une transformation d'un groupe en un DtoCompte. Une transformation ça se fait avec map().

    Ensuite pareil, récupérer les infos communes à partir du premier compte du groupe (puisqu'ils sont censés tous avoir les mêmes), et calculer les deux sommes avec stream/map/reduce
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH 8] Probléme récupération variable PHP
    Par hedgehog dans le forum Flash
    Réponses: 5
    Dernier message: 31/08/2006, 01h28
  2. Réponses: 4
    Dernier message: 12/06/2006, 14h08
  3. [C#] [débutant ]Probleme recuperation variable
    Par p1k1 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 08/03/2006, 13h09
  4. [Upload] Upload Probleme recuperation
    Par AlphonseBrown dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2005, 12h46
  5. Probleme recuperation d'une valeur : script vbs -> .bat
    Par pinpin_du_net dans le forum Windows
    Réponses: 3
    Dernier message: 10/05/2005, 13h43

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