Considérez qu'il y a une classe: partenaire strong> 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)]
4 Réponses :
Je pense que cela devrait vous donner au moins quelque chose pour commencer avec: 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> p>
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)]
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());
Vous pouvez améliorer la réduction de la création de nouvelles instances code> partenaires CODE>, si vous déplacez la logique de la carte code> pour la partie de date à une méthode, puis appelez-la comme un KeyMapper code> pour
tomap code> .. En outre pour ce cas d'utilisation, collectez-le avec un
ValueMapper code> pour inclure le montant en tant que valeur et simplifier l'opération de fusion..then en streaming des entrées de La carte
code> obtenue enfin
mapper code> à l'objet souhaité comme une sortie.
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}]
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.