0
votes

Utilisation des flux Java regroupant les données de la liste en fonction des intervalles de date et de la somme du champ montant

Considérez qu'il y a une classe: partenaire strong> xxx pré>

maintenant, j'ai une liste d'objets partenaires triés dans la commande décroissante, par exemple: p>

[Partner(invoiceDate=2020-01-31, amount=800), 
Partner(invoiceDate=2020-01-15, amount=800)]


11 commentaires

Ce serait une question intéressante ... si cela incluait votre tentative jusqu'à présent.


Il n'y a aucune raison d'utiliser des flux pour cela.


@ernest_k Je suis capable d'écrire un flux pour regrouper les données en fonction de la date et de la somme du montant, mais d'ajouter la logique d'intervalle est où je cherche des conseils.


@farzainpathan c'est tout ce qui est nécessaire. Ajoutez simplement ce que vous avez fait et indiquez où vous êtes coincé et que les gens sont heureux d'aider :-)


Et vous avez essayé un b c, ils n'ont pas fonctionné parce que ...


PartNetkerList .stream () .Collect (Collectors.GroupingBy (Partner: GetinVoicedate)) .RyRySet () .map () .map (localDaTelistitry -> {localdate date = localDatelisTentry.getkey (); bigdecimal somme = localDaTelistitry. getvalue () .stream () .map (partenaire :: getamout) .Reduce (bigdecimal.zero, bigdecimal :: Ajouter); retourner nouveau partenaire (date, somme);}) .Collect (collectionneurs.tolist ()); / code>


La liste est-elle triée? Celui de votre exemple est trié par la date descendante.


@ernest_k avec le code ci-dessus, j'ai pu atteindre le regroupement des données avec date. Comme dit, je cherchais des conseils pour regrouper la date d'intervalle. (excuses pour le format d'apprentissage)


@Abhijitsarkar Oui La liste sera triée en ordre décroissant


@farzainpathan Ajoutez votre code éprouvé en poste alors ce sera plus lisible


@farzainpathan Modifiez la question avec ce code que vous avez essayé au lieu de le partager dans des commentaires.


4 Réponses :


0
votes

Je pense que cela devrait vous donner au moins quelque chose pour commencer avec: xxx

Vous pouvez utiliser le collecteur de carte avec la fonction de fusion pour obtenir la somme de tous les éléments avec la même clé. < / p>


0 commentaires

1
votes

Utiliser groupingby code> aiderait dans une telle situation. Voici l'une des approches:

[Partner(invoiceDate=2020-01-31, amount=800), 
Partner(invoiceDate=2020-01-15, amount=800)]


0 commentaires

1
votes

Vous pouvez la première carte FERFICEDERE CODE> dans la date d'intervalle de 15 jours. Ensuite, utilisez collectors.tomap code> pour mapper les données dans pour FERFICEDATE CODE> et Sum the montant code> dans la fonction Fusionner en créant de nouveaux parter code > Objet. Enfin, obtenez les valeurs de carte comme liste.

static LocalDate getIntervalDate(LocalDate d) {
    return (d.getDayOfMonth() > 15 ? d.withDayOfMonth(d.lengthOfMonth()) 
                                   : d.withDayOfMonth(15));
}

List<Partner> res = list.stream()
    .collect(Collectors.toMap(e -> getIntervalDate(e.getInvoiceDate()), 
                              e -> e.getAmount(), (a, b) -> a.add(b)))
    .entrySet()
    .stream()
    .map(e -> new Partner(e.getKey(), e.getValue()))
    .collect(Collectors.toList());


1 commentaires

Vous pouvez améliorer la réduction de la création de nouvelles instances partenaires , si vous déplacez la logique de la carte pour la partie de date à une méthode, puis appelez-la comme un KeyMapper pour tomap .. En outre pour ce cas d'utilisation, collectez-le avec un ValueMapper pour inclure le montant en tant que valeur et simplifier l'opération de fusion..then en streaming des entrées de La carte obtenue enfin mapper à l'objet souhaité comme une sortie.



0
votes

La verbosité de Java et l'absence de type tuple rend le code un peu plus longtemps, cela peut être fait en une seule passe sans regroupement.

[BiWeeklyReport{amount=800, invoiceDate=2020-01-11}, BiWeeklyReport{amount=800, invoiceDate=2020-01-21}]


0 commentaires