ProgramlamaJava Geliştirici

Java Stream API nedir, koleksiyon işleme işlemleri için doğru şekilde nasıl kullanılır ve veri akışları ile çalışırken dikkate alınması gereken noktalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Akışlar tembeldir: hesaplamalar sadece terminal işlem sırasında gerçekleşir
  • Terminal işlemden sonra akış kapalı sayılır
  • Paralel işleme geçiş yapılabilir (parallelStream()), ancak koleksiyonların ve fonksiyonların thread-safety'sine dikkat edilmelidir

Sıkıcı Sorular.

Kapalı 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.

Tipik hatalar ve anti-paterller

  • Lambda/stream içinde mutable dış değişkenlerin kullanımı
  • Ara işlemlerden (terminal işlem olmadan hiç bir şey olmaz) anlık etki beklemek
  • Thread-safe olmayan koleksiyonlara .parallelStream() uygulamak

Hayattan Bir Örnek

Olumsuz durum

Bir 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:

  • Kod kompakt

Eksiler:

  • Yarış koşulları, istisnalar olabilir
  • Thread-safety ihlali

Olumlu durum

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:

  • Güvenli, okunabilir, etkili kod
  • Paralel akışlara kolay geçiş

Eksiler:

  • Fonksiyonel stile alışkanlık gerektirir