Sorunun Tarihi:
Stream API, Java 8'de işlevsel programlamayı ve koleksiyonların paralel işlenmesini kolaylaştırmak için eklenmiştir. Veriler üzerinde lambda ifadeleri aracılığıyla işlem zincirleri tanımlamanın rahat bir yolunu sağlar.
Sorun:
Stream API olmadan, koleksiyonları filtreleme, sıralama ve birleştirme için hacimli idari kodlar yazmak gerekiyordu. Hata potansiyeli, bakım zorluğu, manuel paralel işleme çabalarında verimsizlik.
Çözüm:
Stream API, ara (intermediate) ve terminal (terminal) işlemlerden oluşan bir pipeline kurmayı mümkün kılar. Akışlar tembeldir, verilerle ardışık veya paralel çalışır, kod daha kompakt ve ifadeli hale gelir.
Koleksiyonun işlenmesine dair örnek:
List<String> names = Arrays.asList("Anna", "Ivan", "Petr", "Eva"); names.stream() .filter(s -> s.length() > 3) .map(String::toUpperCase) .sorted() .forEach(System.out::println);
Ana özellikler:
parallelStream()), ancak koleksiyonların ve fonksiyonların thread-safety'sine dikkat edilmelidirKapalı bir Stream tekrar kullanılabilir mi?
Hayır, kapalı bir Stream'i yeniden kullanmaya çalışmak IllegalStateException fırlatır. Akış tek kullanımlıktır.
Stream oluşturulduktan sonra kaynak koleksiyondaki değişiklikler etkiler mi?
Evet, eğer koleksiyon Stream oluşturulduktan sonra ama terminal işlemeden önce değiştirilirse, ConcurrentModificationException'lar mümkün olabilir.
Stream işlemleri içinde dış değişkenler kullanılabilir mi?
Tavsiye edilmez, çünkü paralel bir akışta beklenmedik hatalara yol açar. Stream pipeline'ında mutable yan etkilerden kaçınılması daha iyi olur.
.parallelStream() uygulamakBir programcı, Stream aracılığıyla dış bir listeyi değiştiren bir metodu çağırıyor — bu ardışık yürütme sırasında çalışır, ancak paralel yürütme sırasında veri yapısında bozulma meydana getirir.
Artılar:
Eksiler:
Tüm pipeline temiz bir şekilde inşa edilir: işlemler yan etkiler içermez, yalnızca immutable koleksiyonlar kullanılır, nihai sonuç collector aracılığıyla toplanır.
Artılar:
Eksiler: