Java Streams Nedir ve Nasıl Kullanılır?


Java Streams, Java 8 sürümüyle birlikte sunulan bir özelliktir. Bu özellik, verileri işlemek ve manipüle etmek için kolay bir yol sağlar. Streams, sıralı ve paralel olarak veri işleme yapabilen, birbirine bağlı bir dizi işleve sahip bir  tool'dur denebilir. Bu işlemler, filtrelendirme, eşleştirme, sıralama ve toplama gibi işlemleri içerir.

Java Streams, kodun okunabilirliğini artırır ve kodu daha az hata yapma olasılığı olan bir işleme tarzına yönlendirir. Ayrıca, verileri işlemek için gereksiz döngüler veya geçici değişkenler oluşturmak yerine, kodun daha kısa ve daha açık hale getirilmesine olanak tanır.

Java Streams kullanarak, bir veri kaynağından (dizi, liste, dosya vb.) veri öğeleri alabilir ve bu öğeler üzerinde bir dizi işlem gerçekleştirebilirsiniz. Bu işlemler, bir lambda ifadesi aracılığıyla sağlanır. Lambda ifadeleri, Java 8 ile birlikte sunulan başka bir özelliktir ve bir işlevi açık bir şekilde tanımlar.

Java Streams kullanarak bir veri kaynağındaki verileri işlemek için üç temel adım vardır:
  • Bir Stream nesnesi oluşturma: Veri kaynağından bir Stream nesnesi oluşturun. Bu, bir dizi veya bir liste gibi bir veri kaynağı olabilir.
  • Aracılık işlemleri uygulama: Stream üzerinde aracılık işlemleri uygulayın. Bu işlemler, Stream nesnesindeki verileri filtreleyebilir, sıralayabilir, eşleştirebilir veya değiştirebilir.
  • Son işlemi uygulama: Son olarak, bir son işlem uygulayarak sonuçları alın. Bu işlemler, Stream nesnesindeki verileri toplayabilir, sayabilir veya toplayabilir. 

Aşağıdaki örnek kod, bir dizi kullanarak Java Streams kullanımını gösterir: 

int[] numbers = {1, 2, 3, 4, 5};

int sum = Arrays.stream(numbers)
                .filter(n -> n % 2 == 0)
                .map(n -> n * 2)
                .sum();

System.out.println("Toplam: " + sum);

Bu örnekte, filtreden geçirilmiş çift sayıların her biri, map yöntemi ile 2 ile çarpılarak yeni bir akışa taşınır. Daha sonra sum yöntemi, bu yeni akışdaki öğelerin toplamını hesaplar.

Örneğin, yukarıdaki kod çalıştırıldığında, çift sayılar 2 ile çarpılır ve sonra toplanır. 2 ve 4 sayıları çift olduğu için filtrelenir ve sonuç olarak 12 döndürülür. System.out.println yöntemi kullanılarak, "Toplam: 12" mesajı yazdırılır.

Örnek 2: Harfleri Büyük Harfe Dönüştürme

Aşağıdaki örnek, bir liste içindeki tüm harfleri büyük harfe dönüştürmek için Java Streams kullanır:

List<String> words = Arrays.asList("Merhaba", "Dünya", "Nasılsın?");

List<String> uppercaseWords = words.stream()
                                    .map(String::toUpperCase)
                                    .collect(Collectors.toList());

System.out.println(uppercaseWords);

Örnekteki kod, map yöntemi kullanarak tüm dize öğelerini büyük harfe dönüştürür. Daha sonra, collect yöntemi kullanarak büyük harf dize öğelerinin bir listesi oluşturulur ve yazdırılır.

Örnek 3: Bir Liste İçindeki Maksimum Değerin Bulunması

Aşağıdaki örnek, bir liste içindeki maksimum değeri bulmak için Java Streams kullanır:

List<Integer> numbers = Arrays.asList(3, 6, 1, 8, 2, 9);

int max = numbers.stream()
                .mapToInt(Integer::intValue)
                .max()
                .orElse(0);

System.out.println("Maksimum: " + max);

Örnekteki kod, mapToInt yöntemi kullanarak Integer nesnelerini int veri tipine dönüştürür. Daha sonra, max yöntemi kullanarak liste içindeki maksimum değeri bulur ve orElse yöntemi kullanarak bir varsayılan değer belirler.

Örnek 4: Bir Liste İçindeki Distinct Değerleri Bulma

Aşağıdaki örnek, bir liste içindeki tekrarlanan öğeleri kaldırmak ve yalnızca benzersiz öğeleri bulmak için Java Streams kullanır:

List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 3, 5, 6, 5, 7);

List<Integer> distinctNumbers = numbers.stream()
                                        .distinct()
                                        .collect(Collectors.toList());

System.out.println(distinctNumbers);

Örnekteki kod, distinct yöntemi kullanarak liste içindeki yinelenen öğeleri kaldırır. Daha sonra, collect yöntemi kullanarak benzersiz öğelerin bir listesi oluşturulur ve yazdırılır.

Örnek 5: Bir Dizi İçindeki Öğeleri Sıralama

Aşağıdaki örnek, bir dizideki öğeleri sıralamak için Java Streams kullanır:

int[] numbers = {3, 6, 1, 8, 2, 9};

int[] sortedNumbers = Arrays.stream(numbers)
                            .sorted()
                            .toArray();

System.out.println(Arrays.toString(sortedNumbers));

Örnekteki kod, sorted yöntemi kullanarak dizideki öğeleri sıralar. Daha sonra, toArray yöntemi kullanarak sıralanmış öğelerin bir dizi oluşturulur ve Arrays.toString yöntemi kullanılarak yazdırılır.

Örnek 6: Bir Liste İçindeki Öğeleri Toplama

Aşağıdaki örnek, bir liste içindeki öğeleri toplamak için Java Streams kullanır:

List<Integer> numbers = Arrays.asList(3, 6, 1, 8, 2, 9);

int sum = numbers.stream()
                .reduce(0, (a, b) -> a + b);

System.out.println("Toplam: " + sum);

Örnekteki kod, reduce yöntemi kullanarak liste içindeki öğeleri toplar. Başlangıç değeri olarak 0 kullanılır ve lambda ifadesi (a, b) -> a + b toplama işlemini gerçekleştirir. System.out.println yöntemi kullanılarak, "Toplam: " mesajı ile toplam değeri yazdırılır.

Örnek 7: Bir Liste İçindeki Öğelerin Sayısını Bulma

Aşağıdaki örnek, bir liste içindeki öğelerin sayısını bulmak için Java Streams kullanır:

List<Integer> numbers = Arrays.asList(3, 6, 1, 8, 2, 9);

long count = numbers.stream()
                    .count();

System.out.println("Sayıların sayısı: " + count);

Örnekteki kod, count yöntemi kullanarak listenin öğelerinin sayısını bulur ve System.out.println yöntemi kullanılarak "Sayıların sayısı: " mesajı ile sayıları yazdırır.

Örnek 8: Bir Dizideki Çift Sayıları Bulma ve Farklılaştırma

Bu örnek, bir dizi içindeki çift sayıları bulmak ve farklılaştırmak için Java Streams kullanır. İlk olarak, bir int türünde dizi oluşturulur ve bu diziye bazı örnek değerler atanır. Daha sonra, stream() yöntemi çağrılarak, dizi üzerinde bir IntStream nesnesi oluşturulur.

Bu IntStream nesnesi üzerinde filter() yöntemi kullanılarak, sadece çift sayılar filtrelenir. Ardından, map() yöntemi kullanılarak, her öğe iki katına çıkarılır. Bu işlemin sonucunda, tekrar aynı sayılar oluşabileceğinden, distinct() yöntemi kullanılarak sonuçlar farklılaştırılır. Son olarak, forEach() yöntemi kullanılarak sonuçlar ekrana yazdırılır.

int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.stream(numbers)
      .filter(n -> n % 2 == 0)
      .map(n -> n * 2)
      .distinct()
      .forEach(n -> System.out.print(n + " "));

Bu örnekte, filter() yöntemi kullanılarak sadece çift sayılar filtrelenir. Daha sonra, map() yöntemi kullanılarak her öğe iki katına çıkarılır. Sonra, distinct() yöntemi kullanılarak sonuçlar farklılaştırılır. Son olarak, forEach() yöntemi kullanılarak sonuçlar ekrana yazdırılır.

Çıktı: 4 8 12 16 20

Bu örnekte, filter(), map(), distinct() ve forEach() yöntemlerinin kullanımı, Stream nesnesi üzerinde farklı işlemler gerçekleştirmek için bir arada kullanılır.

Örnek 9: Bir Java'da String Operasyonları, Karmaşık Bir Örnek

Aşağıda, Java Streams kullanarak bir List içindeki String öğeleri işleyen bir karmaşık örnek verilmiştir. Bu örnekte, verilen List içindeki String öğelerinden sadece bir tane seçilir ve sonra bu seçilen String öğesi, diğer String öğelerinden farklı karakterlere sahip olacak şekilde değiştirilir.

List<String> words = Arrays.asList("hello", "world", "java", "programming", "language");

String selectedWord = words.stream()
        .filter(word -> word.length() >= 5) // 5 veya daha fazla karaktere sahip olanları filtrele
        .distinct() // yalnızca farklı öğeleri seç
        .findFirst() // ilk öğeyi seç
        .orElse(""); // eğer seçilen bir öğe yoksa, boş bir String döndür

String result = selectedWord.chars()
        .distinct() // yalnızca farklı karakterleri seç
        .mapToObj(c -> String.valueOf((char) c))
        .collect(Collectors.joining()); // seçilen karakterleri birleştir

System.out.println("Selected word: " + selectedWord);
System.out.println("Result: " + result);


Bu örnek kod bloğu, öncelikle bir List içindeki String öğelerini alır ve ardından bu öğeleri işlemek için Java Streams API'sini kullanır. İlk olarak, filter() yöntemi ile 5 veya daha fazla karaktere sahip olanları filtrelenir. Daha sonra, distinct() yöntemi ile yalnızca farklı öğeler seçilir ve findFirst() yöntemi ile ilk öğe seçilir. Eğer seçilen bir öğe yoksa, orElse() yöntemi ile boş bir String döndürülür.

Sonraki adımda, seçilen String öğesi chars() yöntemi ile bir IntStream nesnesine dönüştürülür. Daha sonra, distinct() yöntemi ile yalnızca farklı karakterler seçilir ve mapToObj() yöntemi ile her karakter bir String nesnesine dönüştürülür. Son olarak, collect() yöntemi ile seçilen karakterler birleştirilir ve sonuç olarak ekrana yazdırılır.

Bu örnek kod bloğunun çıktısı aşağıdaki gibidir:

Selected word: programming
Result: progamin

Bu çıktıda, List içindeki String öğelerinden sadece programming öğesi seçilmiştir. Sonrasında: p, r, o, g, a, m, i, n karakterleri farklı karakterlere sahiptir ve bu karakterler progamin olarak birleştirilmiştir.

Bu yazıda Java Streams kullanarak verileri işleme örnekleri sunduk. Java Streams, kodu daha okunaklı ve fonksiyonel hale getirerek veriler üzerinde işlem yapmayı kolaylaştırır. Umarız bu yazı, Java Streams konusunda size yardımcı olmuştur. Teşekkürler ve diğer yazılarımızı takip etmeye devam edin!


Yorumlar

Bu blogdaki popüler yayınlar

Python ile Turtle Kütüphanesiyle Çizim Denemesi 2

Girdimize en yakın palindrom değeri bulan program (Python3 ile)

Python ile Yazıyı Piramit Gibi Çizdirme