2
votes

Vérification conditionnelle du flux Java 8

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? 

2 commentaires

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


3 Réponses :


3
votes

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());


1 commentaires

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



4
votes

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.


3 commentaires

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é :)



0
votes

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()


0 commentaires