Je lis des informations sur les flux Java et je découvre de nouvelles choses au fur et à mesure. L'une des nouveautés que j'ai trouvées était la peek()
fonction. Presque tout ce que j'ai lu sur peek dit qu'il devrait être utilisé pour déboguer vos Streams.
Et si j'avais un Stream où chaque compte a un nom d'utilisateur, un champ de mot de passe et une méthode login () et logIn ().
j'ai aussi
Consumer<Account> login = account -> account.login();
et
Predicate<Account> loggedIn = account -> account.loggedIn();
Pourquoi serait-ce si mauvais?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Pour autant que je sache, cela fait exactement ce qu'il est prévu de faire. Il;
- Prend une liste de comptes
- Tente de se connecter à chaque compte
- Filtre tous les comptes non connectés
- Collecte les comptes connectés dans une nouvelle liste
Quel est l'inconvénient de faire quelque chose comme ça? Une raison pour laquelle je ne devrais pas continuer? Enfin, sinon cette solution alors quoi?
La version originale de ceci utilisait la méthode .filter () comme suit;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
peut-être l'opération que vous souhaitez par opposition à peek
. Ce n'est pas parce que c'est dans l'API qu'il n'est pas ouvert aux abus (comme Optional.of
).
.peek(Account::login)
et .filter(Account::loggedIn)
; il n'y a aucune raison d'écrire un consommateur et un prédicat qui appelle simplement une autre méthode comme celle-là.
forEach()
et peek()
, ne peuvent fonctionner que via des effets secondaires; ceux-ci doivent être utilisés avec précaution. ». Ma remarque était plutôt de rappeler que l' peek
opération (qui est conçue à des fins de débogage) ne doit pas être remplacée en faisant la même chose dans une autre opération comme map()
ou filter()
.