J'ai une liste d'entiers comme celle-ci:
List<Integer> list2 = list.stream().filter(x -> x > 0).map(x -> x - 1).collect(Collectors.toList()); //list.stream().findFirst().ifPresent(x -> x - 1).collect(Collectors.toList()); //This is giving error list.stream().forEach(x ->x.); //How to use this in this case
et Je veux soustraire 1 de chaque élément SAUF 0.
J'ai essayé quelques approches comme en appliquant le filtre de Java 8 mais il a supprimé les valeurs nulles de la liste.
J'ai essayé d'appliquer d'autres méthodes fournies pour l'API de flux comme foreach () ou .findFirst () ,. findAny ()
mais cela n'a pas fonctionné.
List<Integer> list = new ArrayList(Arrays.asList(30,33,29,0,34,0,45));
Résultat réel: [29,32,28,-1,33,-1,44
Attendu Résultat: [29,32,28,0,33,0,44[/code>
4 Réponses :
Dans l'exemple, vous pouvez utiliser la méthode Math.max
:
list.stream() // 1,2,0,5,0 .filter(x -> x > 0) // 1,2,5 .map(x -> x - 1) // 0,1,4 .collect(Collectors.toList()); // will return list with three elements [0,1,4]
Dans votre cas:
list.stream() .map(x -> Math.max(0, x - 1)) .collect(Collectors.toList());
Salut, Le second ne fonctionne pas car il supprime les 0 de la liste que je ne veux pas. Mais votre première solution fonctionne pour moi :) alors merci
Je viens d'expliquer ce qui est fait à chaque étape de votre solution.
Juste pour noter que Math.max (0, x - 1)
ne fonctionnerait pas pour une entrée d'entiers négatifs.
et le .filter (x -> x> 0)
ne fonctionnerait pas non plus pour l'exemple de la question. l'avis 0 doit être pris en compte dans la sortie.
list.stream() .map(x -> x == 0 ? x : x - 1) .collect(Collectors.toList());
Salut @Eugene, Merci pour la réponse rapide. Ça fonctionne. Juste pour plus d'informations à ce sujet, pouvons-nous faire cette opération sur la même liste sans en créer une autre, par exemple en utilisant la méthode .foreach ().
@Vaibhav_Sharma pas forEach
, mais vous pouvez utiliser replaceAll
Une version non-stream utilise replaceAll
list.replaceAll(x -> x != 0 ? x - 1 : x);
Autre solution:
IntStream.range(0, list.size()) .map(e -> list.get(e) == 0 ? list.get(e) : list.get(e) - 1) .forEach(System.out::println);
Résultat:
29 32 28 0 33 0 44
"mais il a supprimé les valeurs nulles": il l'a fait parce que vous le lui avez demandé.
@Raedwald oui, en fait, je ne suis pas très conscient de l'utilisation de l'API des flux Java8, c'est pourquoi j'ai essayé certaines approches en recherchant sur Google, mais mon intention est de générer cette liste finale.