Diretório do artigo
Uso de tipos de operação e espiada no java 8 stream
1. Introdução
Como uma operação de fluxo, o java 8 stream possui dois tipos de operação, operação intermediária e operação de término. Qual é a diferença entre os dois?
Vejamos um exemplo de espiada:
Stream<String> stream = Stream.of("one", "two", "three","four");
stream.peek(System.out::println);
No exemplo acima, nossa intenção original era imprimir o valor de Stream, mas na verdade não há saída.
Porque
Operação intermediária e operação de término
Um fluxo Java 8 é composto de três partes. Fonte de dados, zero ou uma ou mais operações intermediárias, uma ou zero operações de terminação.
A operação intermediária é o processamento de dados. Observe que a operação intermediária é uma operação lenta e não será iniciada imediatamente. É necessário aguardar a execução da operação de encerramento.
A operação de encerramento é a operação inicial do fluxo. Somente quando a operação de encerramento é adicionada, o fluxo realmente inicia a execução.
Portanto, o problema está resolvido, o peek é uma operação intermediária, portanto o exemplo acima não tem saída.
olhadinha
Vamos dar uma olhada na documentação do peek: o peek é usado principalmente para fins de depuração.
Vamos dar uma olhada no uso dos propósitos de depuração:
Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
O exemplo acima mostra:
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR
No exemplo acima, produzimos o valor intermediário do fluxo, o que é conveniente para nossa depuração.
Por que usá-lo apenas como depuração? Vejamos outro exemplo:
Stream.of("one", "two", "three","four").peek(u -> u.toUpperCase())
.forEach(System.out::println);
No exemplo acima, usamos peek para converter o elemento em maiúsculas. Em seguida, imprima:
one
two
three
four
Você pode ver que os elementos no fluxo não foram convertidos em maiúsculas, portanto, a espiada é usada apenas para depuração.
Veja a comparação de um mapa:
Stream.of("one", "two", "three","four").map(u -> u.toUpperCase())
.forEach(System.out::println);
Saída:
ONE
TWO
THREE
FOUR
Pode-se ver que o mapa é uma verdadeira conversão dos elementos.
Claro que há exceções para espiar, e se tivermos um objeto no Stream?
@Data
@AllArgsConstructor
static class User{
private String name;
}
List<User> userList=Stream.of(new User("a"),new User("b"),new User("c")).peek(u->u.setName("kkk")).collect(Collectors.toList());
log.info("{}",userList);
Resultado de saída:
10:25:59.784 [main] INFO com.flydean.PeekUsage - [PeekUsage.User(name=kkk), PeekUsage.User(name=kkk), PeekUsage.User(name=kkk)]
Vemos que, se for um objeto, o resultado real será alterado.
Conclusão
Neste artigo, explicamos os dois tipos de operação de fluxo e resumimos o uso de peek. Espero que você possa dominá-lo.
Exemplo deste artigo https://github.com/ddean2009/learn-java-streams/tree/master/stream-peek
Bem-vindo a prestar atenção ao meu número público: essas coisas do programa, mais emocionante esperando por você!
Para mais informações, visite www.flydean.com