IntelliJ IDEA, şu an için her for döngüsü için bir Java 8 "forEach" çağrısı ile değiştirmemi önerdi:
for (Object o : objects) {
if (o instanceof SomeObject) {
doSomething();
}
}
Önerilen çağrı şöyle:
objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());
Stream'in temel işlevlerinin nasıl çalıştığını yanlış anlamadığım sürece, bana göre akışı kullanmak, her döngü için standart O (n) işleminin aksine bir O (2n) işlemidir.
8
Sizce neden O ^ 2? Aslında, akışlar özellikle (a) daha iyi sözdizimine izin vermek ve (b) fazladan ek yük getirmemek için icat edildi . (Aslında, genellikle tembel değerlendirme yoluyla ek yükü azaltırlar .)
—
Kilian Foth
Sadece sözdizimine dayanarak, ilk olarak filtrelemek ve daha sonra kodumu çalıştırmak için filtrelenmiş nesneler üzerinde ikinci kez tekrarlamak gibi görünüyor.
—
Mirrana
Bunu yapsa bile, hala O (2 * N), yani O (N), yani doğrusal ve ikinci dereceden değil. Ama aslında iterasyonlar birbiri ile serpiştirilir ve sonuç zaten bilinirse her ikisi de erken sona erebilir - bu akarsuların güzelliği. Java 8'deki akışları okumak için kesinlikle 15 dakika harcamaya değer; Venkat Subramaniam'ın yazdığı gibi, '' Lambda ifadeleri Java 8'in giriş kapısıdır, ancak Akışlar gerçek bağımlılıktır. ''
—
Kilian Foth
Ayrıca: döngünüz bir antipattern;)
—
Thomas Junk
@ThomasJunk Bunun nasıl bir antipattern olduğunu açıklayabilir misiniz? Buna aşina değilim.
—
Mirrana