Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

Stream nasıl çalışır

Stream lazy'dir

filter ve map işi yapmaz, yalnızca pipeline'ı kurar. Terminal operation olmadan hiçbir lambda çalışmaz.

Solda terminal seç: toList veya başka biri. Bundan sonra Sonraki düğmesi çalışır.

Element'ler tek tek geçer

Birçok kişi önce tüm element'lerin filter'dan, sonra hepsinin map'ten geçtiğini sanır. Öyle değil.

Her element tüm pipeline'ı geçer, sonra sıradaki element başlar. Bu yüzden gereksiz iş azalır.

Solda list'i ve işlemleri değiştir: sonuç canlı hesaplanır.

Short-circuit

findFirst, anyMatch ve limit işi erken bitirebilir. Sonuç bulununca kalan element'ler hiç okunmaz.

Burada 6 element var, ama yalnızca 2'si işlenir. Bu, sonsuz stream'lerin de çalışmasını sağlar: Stream.iterate(...).limit(5).

sorted hepsini tutar

sorted stateful işlemdir: sıralamak için tüm element'leri görmelidir. Bu yüzden element'ler önünde birikir.

Sonraki limit(2) işi azaltmaz, source'tan her şey okunur. Mümkünse filter'ı sorted'dan önce yaz.

distinct de gördüğü tüm değerleri hatırlar, ama element'leri hemen bırakır.

count bazen hiçbir şey çalıştırmaz

Burada map lambda'sı bir kez bile çalışmaz. JDK 9'dan beri boyut biliniyorsa count, element'leri gezmez.

filter ekle: boyut artık bilinmez ve lambda çalışır. Solda dene.

Tuzak: peek veya map içindeki yan etkiye güvenme, çalışmayabilir.

Lambda bir object'tir

Lambda bir functional interface object'idir. Capture ettiği değerler object'in içine kopyalanır, bu yüzden local variable effectively final olmalıdır.

Capture etmeyen lambda genellikle aynı object olarak kalır, capture eden ise her seferinde yenisini oluşturabilir.

Stream tek kullanımlıktır: terminal'den sonra yeniden kullanılamaz.