Estou lendo sobre fluxos Java e descobrindo coisas novas à medida que avança. Uma das coisas novas que encontrei foi a peek()
função. Quase tudo o que li na espiada diz que deve ser usado para depurar seus Streams.
E se eu tivesse um Stream em que cada Conta tivesse um nome de usuário, um campo de senha e um método de login () e logIn ().
eu também tenho
Consumer<Account> login = account -> account.login();
e
Predicate<Account> loggedIn = account -> account.loggedIn();
Por que isso seria tão ruim?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Agora, até onde sei, isso faz exatamente o que se pretende fazer. Isto;
- Leva uma lista de contas
- Tenta fazer login em cada conta
- Filtra qualquer conta que não esteja logada
- Coleta as contas conectadas em uma nova lista
Qual é a desvantagem de fazer algo assim? Algum motivo para eu não prosseguir? Por fim, se não esta solução, então o que?
A versão original disso usava o método .filter () da seguinte maneira;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
pode ser a operação que você deseja, ao contrário peek
. Só porque está na API, não significa que não esteja aberto a abusos (como Optional.of
).
.peek(Account::login)
e .filter(Account::loggedIn)
; não há razão para escrever um Consumidor e Predicado que apenas chame outro método como esse.
forEach()
e peek()
, pode operar apenas com efeitos colaterais; estes devem ser usados com cuidado. ”. Minha observação foi mais para lembrar que a peek
operação (projetada para fins de depuração) não deve ser substituída fazendo a mesma coisa dentro de outra operação como map()
ou filter()
.