O IntelliJ IDEA recomendou-me agora mesmo substituir o seguinte loop for-each por uma chamada Java 8 "forEach":
for (Object o : objects) {
if (o instanceof SomeObject) {
doSomething();
}
}
A chamada recomendada seria assim:
objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());
A menos que eu esteja entendendo mal como funciona a funcionalidade subjacente do Stream, parece-me que o uso do stream é uma operação O (2n) em oposição a uma operação O (n) para o padrão para cada loop.
8
Por que você acha que é O ^ 2? De fato, os fluxos foram inventados especificamente para (a) permitir uma sintaxe melhor e (b) não introduzir sobrecarga extra. (Na verdade, eles muitas vezes reduzir a sobrecarga através de avaliação lenta.)
—
Kilian Foth
Apenas com base na sintaxe, parece que é a primeira iteração para filtrar e, em seguida, iterando sobre os objetos filtrados uma segunda vez para executar meu código.
—
Mirrana
Mesmo assim, isso ainda seria O (2 * N), que é O (N), ou seja, linear e não quadrático. Mas, na verdade, as iterações são intercaladas entre si e ambas podem terminar mais cedo se o resultado já for conhecido - essa é a beleza dos fluxos. Definitivamente vale a pena gastar 15 minutos para ler os fluxos no Java 8; como Venkat Subramaniam escreve: "As expressões Lambda são a droga de porta de entrada para o Java 8, mas o Streams é o verdadeiro vício".
—
Kilian Foth
Além: o loop é um antipattern;)
—
Thomas Junk
@ThomasJunk Você pode explicar como é um antipadrão? Eu não estou familiarizado com este.
—
Mirrana