Estoy leyendo sobre las secuencias de Java y descubriendo cosas nuevas a medida que avanzo. Una de las cosas nuevas que encontré fue la peek()
función. Casi todo lo que he leído en el vistazo dice que debería usarse para depurar sus Streams.
¿Qué pasaría si tuviera una transmisión en la que cada cuenta tenga un nombre de usuario, un campo de contraseña y un método de inicio de sesión () e inicio de sesión ()?
tambien tengo
Consumer<Account> login = account -> account.login();
y
Predicate<Account> loggedIn = account -> account.loggedIn();
¿Por qué sería esto tan malo?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Ahora, por lo que puedo decir, esto hace exactamente lo que está destinado a hacer. Eso;
- Toma una lista de cuentas
- Intenta iniciar sesión en cada cuenta
- Filtra cualquier cuenta que no haya iniciado sesión
- Recopila las cuentas registradas en una nueva lista
¿Cuál es la desventaja de hacer algo como esto? ¿Alguna razón por la que no debería proceder? Por último, si no esta solución, ¿entonces qué?
La versión original de esto utilizó el método .filter () de la siguiente manera;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
puede ser la operación que desea en lugar de peek
. El hecho de que esté en la API no significa que no esté abierto al abuso (como Optional.of
).
.peek(Account::login)
y .filter(Account::loggedIn)
; no hay razón para escribir un consumidor y un predicado que simplemente llame a otro método como ese.
forEach()
y peek()
, solo puede operar a través de efectos secundarios; estos deben usarse con cuidado. ". Mi comentario fue más para recordar que la peek
operación (que está diseñada para fines de depuración) no debe reemplazarse haciendo lo mismo dentro de otra operación como map()
o filter()
.