Uso de tipos de operação e espiada no java 8 stream


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

Publicado 172 artigos originais · ganhou 241 · visualizações 480,000+

Acho que você gosta

Origin blog.csdn.net/superfjj/article/details/105698527
Recomendado
Clasificación