Sobes.tech
Middle

Java'nın yeni sürümünde neden akışlar kullanılıyor?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'nın yeni sürümlerinde (Java 8 ve sonrası) stream'lerin kullanımı, verimlilik, kod okunabilirliği ve veri işleme paralelliği ile ilgili birkaç nedene dayanmaktadır:

  • Fonksiyonel programlama: Stream'ler, verilerle ne yapılması gerektiğine odaklanan, daha deklaratif bir tarzda kod yazmayı sağlar, nasıl değil. Bu, okunabilirliği ve bakımı artırır.
  • Paralel işlem: Stream'ler, parallelStream() kullanarak koleksiyonlar üzerinde işlemleri kolayca paralelleştirmeye olanak tanır. JVM, verilerin bölünmesini ve sonuçların birleştirilmesini yönetir, çok iş parçacıklı uygulamaların geliştirilmesini basitleştirir.
  • Verimlilik: Stream'lerde tembel değerlendirme (lazy evaluation) kullanılır, bu da işlemlerin yalnızca gerektiğinde yürütüleceği anlamına gelir ve ek maliyetleri azaltır. Ara işlemler (map, filter) hemen yürütülmez, terminal işlemi (collect, forEach) çağrılana kadar.
  • Koleksiyonların geliştirilmiş işlenmesi: Filtreleme, dönüştürme ve toplama gibi standart ve yüksek seviyeli işlemler sağlar, bu da döngülerle yazılan kod miktarını azaltır.
  • Değiştirilmez işlemler: Stream'ler, oluşturuldukları orijinal koleksiyonu değiştirmez, immutability ilkelerini destekler ve hata ayıklamayı kolaylaştırır.
// Stream kullanımıyla filtreleme ve dönüştürme örneği
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Stream oluşturma
                                  .filter(name -> name.startsWith("C")) // Filtreleme
                                  .map(String::toUpperCase) // Dönüştürme
                                  .collect(Collectors.toList()); // Yeni listeye toplama

System.out.println(filteredNames); // Çıktı: [CHARLIE]

Paralel stream'ler:

// Paralel işlem örneği
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Paralel stream oluşturma
                   .mapToInt(Integer::intValue) // IntStream'e dönüştürme
                   .sum(); // Toplama

System.out.println(sum); // Çıktı: 55 (çok çekirdekli sistemlerde daha hızlı hesaplanabilir)