Ich lese über Java-Streams und entdecke dabei neue Dinge. Eines der neuen Dinge, die ich gefunden habe, war die peek()
Funktion. Fast alles, was ich auf Peek gelesen habe, besagt, dass es zum Debuggen Ihrer Streams verwendet werden sollte.
Was wäre, wenn ich einen Stream hätte, in dem jedes Konto einen Benutzernamen, ein Kennwortfeld sowie eine Methode zum Anmelden () und Anmelden () hat?
ich habe auch
Consumer<Account> login = account -> account.login();
und
Predicate<Account> loggedIn = account -> account.loggedIn();
Warum sollte das so schlimm sein?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Soweit ich das beurteilen kann, macht dies genau das, was es tun soll. Es;
- Nimmt eine Liste von Konten
- Versucht, sich bei jedem Konto anzumelden
- Filtert alle Konten heraus, die nicht angemeldet sind
- Sammelt die angemeldeten Konten in einer neuen Liste
Was ist der Nachteil von so etwas? Gibt es einen Grund, warum ich nicht fortfahren sollte? Wenn nicht diese Lösung, was dann?
In der Originalversion wurde die .filter () -Methode wie folgt verwendet:
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
möglicherweise die gewünschte Operation ist peek
. Nur weil es in der API enthalten ist, heißt das nicht, dass es nicht für Missbrauch offen ist (wie Optional.of
).
.peek(Account::login)
und sein kann .filter(Account::loggedIn)
; Es gibt keinen Grund, ein Consumer and Predicate zu schreiben, das nur eine andere Methode wie diese aufruft.
forEach()
und peek()
kann nur über Nebenwirkungen ausgeführt werden. Diese sollten mit Vorsicht verwendet werden. ”. Meine Bemerkung war eher, um daran zu erinnern, dass die peek
Operation (die für Debugging-Zwecke entwickelt wurde) nicht durch dasselbe in einer anderen Operation wie map()
oder ersetzt werden sollte filter()
.