Java Stream API Nedir ve Nasıl Kullanılır?
Stream API, Java koleksiyonları üzerinde çeşitli veri işleme operasyonları yapabilmenizi sağlayan bir araçtır. Bu operasyonlar filtreleme, sıralama, eşleme ve biriktirme gibi işlevlerden oluşur. Stream API’nin en büyük avantajlarından biri, işlem zincirleri oluşturarak verileri daha kolay ve okunabilir bir şekilde işleyebilmenizdir.
Stream API Kullanımı ve Özellikler
Stream API kullanarak şunları yapabilirsiniz:
- Veri akışları üzerinde filtreleme:
filter()
metodu ile belirli kriterlere uyan elemanları seçebilirsiniz. - Dönüştürme:
map()
metodu kullanarak her bir elemanı farklı bir tipe veya değere dönüştürebilirsiniz. - Sıralama:
sorted()
metodu ile veri akışını belirli bir düzene göre sıralayabilirsiniz. - Biriktirme (Collecting):
collect()
metodu ile stream sonuçlarını listeye, sete veya başka bir koleksiyona dönüştürebilirsiniz.
Örneğin, bir listeyi filtreleyip sıralayıp yazdırmak oldukça basittir:
List<String> names = Arrays.asList("Ali", "Ayşe", "Zeynep", "Mehmet", "Burak");
names.stream()
.filter(name -> name.startsWith("A"))
.sorted()
.forEach(System.out::println);
Yukarıdaki örnekte, isim listemizi “A” harfi ile başlayanları filtreleyip, alfabetik sıraya göre sıralayıp ardından ekrana yazdırıyoruz. Bu kodun kısa ve etkili olması, Stream API’nin gücünü gösteriyor.
Ekstra Kod Örnekleri
1) Veri Akışında Sayısal Değerleri Filtreleme ve Toplama
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sumOfEvenNumbers = numbers.stream()
.filter(num -> num % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("Çift sayıların toplamı: " + sumOfEvenNumbers);
Bu örnekte, çift sayıları filtreleyip toplamını buluyoruz. Stream API sayesinde bu tür işlemler oldukça basit hale geliyor.
2) Veri Akışındaki Elemanları Dönüştürme ve Biriktirme
List<String> cities = Arrays.asList("Ankara", "İstanbul", "İzmir", "Bursa");
List<String> uppercaseCities = cities.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(uppercaseCities);
Bu örnekte, şehir isimlerini büyük harfe çevirip sonuçları bir listeye topluyoruz. map()
metodu kullanarak her bir elemanı dönüştürdük ve ardından collect()
ile bir listeye dönüştürdük.
3) Veri Akışında Belirli Kriterlere Göre Gruplama
List<String> fruits = Arrays.asList("Elma", "Armut", "Çilek", "Erik", "Muz", "Ananas");
Map<Character, List<String>> groupedFruits = fruits.stream()
.collect(Collectors.groupingBy(fruit -> fruit.charAt(0)));
groupedFruits.forEach((key, value) -> {
System.out.println(key + ": " + value);
});
Bu örnekte, meyveleri ilk harflerine göre grupluyoruz. Stream API’nin Collectors.groupingBy()
fonksiyonu sayesinde verileri oldukça kolay bir şekilde gruplamak mümkün.
Stream API’de Zincirleme İşlemler
Stream API’nin en güçlü özelliklerinden biri, işlemleri zincirleyebilme yeteneğidir. Bu özellik, birçok işlemi tek satırda bir araya getirerek karmaşık veri işleme görevlerini daha sade hale getirir.
List<String> countries = Arrays.asList("Türkiye", "Almanya", "Fransa", "İtalya", "İspanya");
countries.stream()
.filter(country -> country.length() > 6)
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
Yukarıdaki örnekte:
- Uzunluğu 6’dan büyük olan ülkeleri filtreledik.
- Sonuçları büyük harfe çevirdik.
- Ülkeleri alfabetik sıraya dizdik.
- Sonuçları ekrana yazdırdık.
Bu tür zincirleme işlemler, kodun daha okunabilir ve bakımı kolay hale gelmesini sağlar.
Bölüm 1’de, Java Stream API’nin ne olduğunu ve temel kullanım örneklerini ele aldık. Stream API ile çalışırken filtreleme, dönüştürme, sıralama ve biriktirme gibi işlemleri nasıl yapabileceğimizi gördük. Bir sonraki bölümde, fonksiyonel programlamayı ve lambda ifadelerini daha detaylı ele alacağız.