for (Canvas canvas : list) {
}
O NetBeans sugere que eu use "operações funcionais":
list.stream().forEach((canvas) -> {
});
Mas por que isso é preferido ? Se alguma coisa, é mais difícil de ler e entender. Você está chamando stream()
, em seguida, forEach()
usando uma expressão lambda com o parâmetro canvas
. Não vejo como isso é melhor do que o for
loop no primeiro trecho.
Obviamente, estou falando apenas de estética. Talvez haja uma vantagem técnica aqui que estou perdendo. O que é isso? Por que eu deveria usar o segundo método?
java
lambda
java8
stream-processing
Ómega
fonte
fonte
Respostas:
Os fluxos fornecem uma abstração muito melhor para a composição das diferentes operações que você deseja realizar sobre as coleções ou os fluxos de dados recebidos. Especialmente quando você precisa mapear elementos, filtrar e convertê-los.
Seu exemplo não é muito prático. Considere o seguinte código do site Oracle .
pode ser escrito usando fluxos:
A segunda opção é muito mais legível. Portanto, quando você tem loops aninhados ou vários loops fazendo processamento parcial, é um candidato muito bom para o uso da API Streams / Lambda.
fonte
stream.map(f).map(g)
≡stream.map(f.andThen(g))
), construção / redução de fusão (ao criar um fluxo em um método e depois passá-lo para outro método que o consome, o compilador pode eliminar o fluxo) e fusão de fluxo (que pode fundir muitas operações de fluxo juntos em um único loop imperativo), o que pode tornar as operações de fluxo muito mais eficientes. Eles são implementados no compilador GHC Haskell, e também em alguns outros compiladores Haskell e outras linguagens funcionais, e existem implementações de pesquisa experimental para o Scala.Outra vantagem do uso da API de streaming funcional é que ele oculta os detalhes da implementação. Apenas descreve o que deve ser feito, não como. Essa vantagem se torna óbvia ao observar as alterações que precisam ser feitas, para alterar a execução de código de thread único para paralelo. Apenas mude o
.stream()
para.parallelStream()
.fonte
Isso é altamente subjetivo. Acho a segunda versão muito mais fácil de ler e entender. Ele corresponde à maneira como outras linguagens (por exemplo, Ruby, Smalltalk, Clojure, Io, Ioke, Seph) o fazem, requer menos conceitos para entender (é apenas uma chamada de método normal como qualquer outra, enquanto o primeiro exemplo é uma sintaxe especializada).
Se alguma coisa, é uma questão de familiaridade.
fonte