List<Map<String,Object>> list= new List<Map<String,Object>>(); System.out.println(list.stream().mapToInt(i -> (Integer)i.get("amount")).sum()); I have a List of items like above. I am trying to print the sum of amount which would be an key inside the map. This works fine. But i am just wondering if there is way if i can just check if the map contains that key in this one line code. Any way to include an if condition of map.containsKey here?
3 Réponses :
Vous pouvez utiliser Stream.filter
pour obtenir uniquement les cartes qui ont la clé montant
pour la somme.
System.out.println(list.stream().filter(m -> m.containsKey("amount")).mapToInt(i -> (Integer)i.get("amount")).sum());
Mais cela n'a pas fonctionné. Si je change la clé de "montant" à "montants" dans l'un des éléments de la carte dans la liste tout en gardant tous les autres comme "montant". Ça casse
Vous recherchez probablement getOrDefault
à utiliser comme:
list.stream().mapToInt(i -> (Integer)i.getOrDefault("amount", 0)).sum());
qui lorsque la clé
n’existe pas, renvoie 0
comme valeur par défaut.
Cela satisfera mon exigence. Mais vous vous demandez toujours si nous pouvons ajouter une logique conditionnelle ici?
@JavaProgrammer bien sûr, vous pouvez insérer .filter (i -> i.containsKey ("amount"))
avant l'étape map
. Mais c’est tellement insignifiant que je ne sais pas si c’est vraiment votre question.
@Holger, alors que la réponse de Naman résout le problème auquel je faisais face d'une certaine manière, votre réponse est exactement ce qu'on m'a demandé :)
vous pouvez utiliser Stream :: filter
en combinaison avec Objects::nonNull
list.stream() .map(map -> map.get("amount")) .filter(Objects::nonNull) .mapToInt(Integer.class::cast) .sum()
Qu'attendez-vous si ce n'est pas le cas? Doit-il être par défaut
0
?Oui, ou je n'ai juste pas besoin de prendre cette carte pour la sommation