6
votes

Comment utiliser stream sur une méthode qui retourne une valeur booléenne avec une condition

J'utilise cette méthode:

listRows.stream().forEach(auditRow -> {
           if(auditRow.actionStr.equals(filter))return true;} else return false;);

et je veux pouvoir la modifier à l'aide de Stream, j'ai essayé ce qui suit, mais il me manque quelque chose:

XXX

mais j'obtiens une erreur.


1 commentaires

Pourquoi utiliser un stream si vous remplacez simplement une boucle par un forEach ? voir aussi: blog.jooq.org/2015/12/08/...


3 Réponses :


3
votes

Vous pouvez le faire comme ceci,

listRows.stream().allMatch(row -> row.nameStr.contains(filter));

Mettre à jour

Selon la suggestion de Holgers, cela peut être simplifié comme ceci.

/ p>

listRows.stream().allMatch(row -> row.nameStr.equals(filter) && row.nameStr.contains(filter));

L'utilisation de est égal à ou contient peut varier en fonction de votre contexte.


4 commentaires

Je pense en même temps que j'ai mis à jour la réponse. Merci !


@nullpointer qui pourrait être une transformation de code correcte, mais qui révèle simplement une erreur logique dans la condition de l'OP. equals (filter) implique contains (filter) , donc si toutes les chaînes doivent être égales, il est inutile de tester également contains (filter) .


Dans ce cas, nous pouvons simplement nous passer de && row.nameStr.contains (filter)


Dépend de l'intention réelle. Peut-être que la logique voulue est contient (filtre) , auquel cas equals (filtre) devrait être supprimé. Dans les deux cas, tester les deux n'a aucun sens (cela s'appliquerait également à la combinaison via || ).



0
votes

J'utiliserais un filtre de flux pour filtrer tous les éléments qui sont vrais et faire un compte sur le résultat.

boolean result = (listRows.stream().filter(row -> row.nameStr.equals(filter) && row.nameStr.contains(filter)).count() == 0);


1 commentaires

mais ce n'est pas le but que je veux vérifier tous les éléments de la liste et vérifier s'ils respectent la condition et si c'est le cas, ils seront retournés.



0
votes

Se débarrasser de toutes les négations en utilisant la loi de de-morgan de telle sorte que

return listRows.stream().allMatch(row -> row.nameStr.contains(filter));

vous pouvez utiliser allMatch comme:

return listRows.stream()
        .noneMatch(row -> (!row.nameStr.equals(filter) 
                || !row.nameStr.contains(filter)));


0 commentaires