Collection.stream (). Filter (). ForEach () her döngü için bir standarda göre etkisiz mi?


15

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

6
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

1
Ayrıca: döngünüz bir antipattern;)
Thomas Junk

1
@ThomasJunk Bunun nasıl bir antipattern olduğunu açıklayabilir misiniz? Buna aşina değilim.
Mirrana

Yanıtlar:


21

Sözdiziminin gerektirdiğine rağmen, Java akışları koleksiyonunuzda bir kez yinelenmez. Her bir zincire, her seferinde bir eleman olmak üzere tüm zinciri uygular.

Sizin durumunuzda, akış tam olarak döngü gibi çalışır. Bir öğeyi alın, yükleminize göre kontrol edin ve işleminizi uygulayın, ardından bir sonraki öğeye geçin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.