9
votes

Comment effectuer une opération mathématique sur certains éléments spécifiques d'une liste en utilisant java 8?

En fonction de certaines conditions, je souhaite effectuer une opération sur un élément spécifique d'une liste uniquement.

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>


2 commentaires

"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.


4 Réponses :


5
votes

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


4 commentaires

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.



6
votes
list.stream()
    .map(x -> x == 0 ? x : x - 1)
    .collect(Collectors.toList());

2 commentaires

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



2
votes

Une version non-stream utilise replaceAll

list.replaceAll(x -> x != 0 ? x - 1 : x);


0 commentaires

0
votes

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


0 commentaires