Java Stream'leri
Java Stream'leri, Java 8 ile birlikte gelen ve veri koleksiyonlarını fonksiyonel bir şekilde işlemeyi sağlayan güçlü bir soyutlamadır. Stream'ler sayesinde veriler üzerinde filtreleme, dönüştürme, sıralama ve toplama gibi işlemler, döngüler kullanmadan ve daha okunabilir bir biçimde gerçekleştirilebilir. Bu yaklaşım, yazılım geliştirme sürecinde kodun bakımını kolaylaştırır, hata riskini azaltır ve performansı optimize eder.
Stream'ler, büyük veri setlerinin işlenmesi, olay veya log yönetimi, rapor üretimi ve karmaşık hesaplamaların paralel olarak yapılması gibi senaryolarda önemli rol oynar. parallelStream()
kullanımı, modern sistem mimarilerinde çok çekirdekli işlemcilerden maksimum verim almayı sağlar. Java Stream'leri aynı zamanda nesne yönelimli programlama (OOP) ilkeleri ile uyumludur; nesneler üzerinde operasyonları modüler ve güvenli bir şekilde gerçekleştirmeyi mümkün kılar.
Önemli kavramlar:
- Söz dizimi (Syntax):
stream()
,parallelStream()
, ara işlemlerfilter
,map
,sorted
ve sonlandırıcı işlemlercollect
,forEach
. - Veri yapıları: List, Set, Map (entrySet() üzerinden), diziler ve Iterable yapılar.
- Algoritmalar: filtreleme, dönüştürme, toplama, istatistik ve veri azaltma (reduction).
- OOP İlkeleri: Stream'ler nesnelerle doğrudan çalışabilir, kapsülleme ve modülerlik sağlar.
Bu eğitim sonunda okuyucu, Stream oluşturmayı, filtre ve dönüştürme işlemlerini uygulamayı, nesne yönetimi ve performans, güvenlik ile hata yönetimi açısından iyi uygulamaları öğrenmiş olacak.
Temel Örnek
javaimport java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class BasicStreamExample {
public static void main(String\[] args) {
List<Integer> sayilar = Arrays.asList(1, 2, 3, 4, 5, 6);
// Çift sayıları filtrele ve karelerini al
List<Integer> kareCiftSayilar = sayilar.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println("Çift sayıların kareleri: " + kareCiftSayilar);
}
}
Bu örnekte bir sayı listesi alınır ve stream()
ile Stream'e dönüştürülür. filter
metodu ile sadece çift sayılar seçilir ve map
ile kareleri hesaplanır. Sonlandırıcı collect(Collectors.toList())
ile sonuçlar yeni bir listede toplanır.
Örnek, Stream'in temel kullanımını ve ara işlemler (filter
, map
) ile sonlandırıcı işlemi (collect
) göstermektedir. Döngü kullanımını ortadan kaldırarak kod okunabilirliğini artırır. Gerçek uygulamalarda büyük veri işleme, istatistik analiz ve toplu veri işlemlerinde çok faydalıdır.
Pratik Örnek
javaimport java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class AdvancedStreamExample {
static class Calisan {
String isim;
int yas;
double maas;
Calisan(String isim, int yas, double maas) {
this.isim = isim;
this.yas = yas;
this.maas = maas;
}
public String getIsim() { return isim; }
public int getYas() { return yas; }
public double getMaas() { return maas; }
}
public static void main(String[] args) {
List<Calisan> calisanlar = Arrays.asList(
new Calisan("Ali", 28, 5000),
new Calisan("Ayşe", 34, 7000),
new Calisan("Can", 22, 3000),
new Calisan("Deniz", 29, 6000)
);
// 25 yaş üzeri en yüksek maaşlı çalışanı bul
Optional<Calisan> enYuksekMaas = calisanlar.stream()
.filter(c -> c.getYas() > 25)
.max((c1, c2) -> Double.compare(c1.getMaas(), c2.getMaas()));
enYuksekMaas.ifPresent(c -> System.out.println("25 yaş üstü en yüksek maaş: " + c.getIsim() + " - " + c.getMaas()));
}
}
Bu ileri düzey örnekte, Calisan
nesnelerinin bulunduğu bir liste Stream ile işlenir. filter
ile 25 yaş üzeri çalışanlar seçilir, max
ile en yüksek maaş belirlenir. Sonuç Optional
ile dönülür, böylece değer yoksa NullPointerException riski ortadan kalkar.
Stream'ler OOP ilkeleriyle uyumlu çalışarak karmaşık nesneler üzerinde fonksiyonel ve verimli işlemler sağlar. Raporlama, finansal analiz ve insan kaynakları yönetimi gibi uygulamalarda kullanışlıdır. Döngüleri azaltarak kod okunabilirliği ve bakım kolaylığı sağlanır, hafıza sızıntısı riski azaltılır.
İyi uygulamalar ve yaygın hatalar:
İyi uygulamalar:
- Ara işlemleri açık ve okunabilir şekilde zincirlemek.
- Eksik olabilecek değerler için
Optional
kullanmak. - Büyük koleksiyonlarda
parallelStream()
kullanmak, nesne güvenliğini sağlamak. -
Stream'i gereksiz tekrar kullanmaktan kaçınmak.
Yaygın hatalar: -
Çok sayıda ara işlem kullanarak performansı düşürmek.
- I/O veya veri tabanı ile etkileşimde hata yönetimini ihmal etmek.
- Büyük nesneleri bellek içinde uzun süre tutmak.
- Küçük koleksiyonlarda paralel stream kullanmak performans kaybettirebilir.
peek()
metodu ile ara adımlardaki elemanlar incelenebilir. Optimizasyon için doğru veri yapısı seçilmeli ve gereksiz işlemler kaldırılmalıdır. Stream içinde nesne durumunu değiştirmekten kaçının, bu tutarlılık ve güvenlik sağlar.
📊 Referans Tablosu
Element/Concept | Description | Usage Example |
---|---|---|
stream() | Koleksiyondan Stream oluşturur | List<Integer> nums = list.stream().collect(Collectors.toList()); |
filter() | Koşula göre elemanları seçer | numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); |
map() | Stream elemanlarını dönüştürür | numbers.stream().map(n -> n * n).collect(Collectors.toList()); |
collect() | Stream elemanlarını koleksiyona toplar | numbers.stream().map(n -> n * n).collect(Collectors.toList()); |
Optional | Olmayabilecek değerleri güvenli şekilde temsil eder | Optional<Calisan> c = list.stream().findFirst(); |
Özet ve sonraki adımlar:
Java Stream'lerini öğrenerek, Stream oluşturma, filtreleme, dönüştürme ve toplama işlemlerini uygulayabilir, karmaşık nesnelerle fonksiyonel ve OOP uyumlu çalışmalar gerçekleştirebilirsiniz. Bu, backend sistemlerin okunabilirliğini, bakımını ve performansını artırır.
Sonraki adımlar olarak parallelStream()
, sonsuz Stream'ler ve özel koleksiyonlar üzerinde çalışmayı deneyin. Veri analizi, log işleme ve raporlama senaryoları ile pratik yapmak becerilerinizi pekiştirir. Resmî Java dokümantasyonu ve ileri seviye eğitimler ile sürekli öğrenmeye devam edin.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu konudaki anlayışınızı pratik sorularla test edin.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek