🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-19: Stream API ve Bildirimsel Veri İşleme 🌊

Konu Özeti

Java 8 ile gelen Stream API, koleksiyonlar üzerinde döngü yazmadan bildirimsel veri işleme olanağı sunar. Veri saklamayan ve orijinal koleksiyonu değiştirmeyen bu yapı, tembel değerlendirme ile çalışır. Stream zinciri kaynak, ara işlemler (filter, map, sorted) ve soncul işlemlerden (collect, count, reduce) oluşur. Örnekte çalışan listesi üzerinde filtreleme, dönüştürme ve maaş hesaplamaları gösterilir. Ayrıca büyük veri kümeleri için parallelStream kullanımına değinilir.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-19: Stream API ve Bildirimsel Veri İşleme 🌊

Selamlar! Serimizin 19. bölümüne hoş geldiniz.

Önceki bölümde `Lambda Expressions`, `@FunctionalInterface` mimarisini ve Metot Referanslarını (`::`) incelemiştik. Bu bölümde ise modern Java geliştirmenin en güçlü ve zarif aracı olan **Stream API** konusunu işleyeceğiz.

---

📌 1. Stream API Nedir? 🌊

Java 8 ile gelen Stream API; koleksiyonlar (`List`, `Set` vb.) üzerinde döngü yazmadan (`for`, `while`), bildirimsel (declarative) bir tarzda filtreleme, dönüştürme, gruplama ve sıralama işlemleri yapmamızı sağlar.

### Stream'in Temel Mantığı:
• **Veri Saklamaz:** Bir veri yapısı (data structure) değildir, bir veri akışıdır.
• **Orijinal Veriyi Değiştirmez:** Üzerinde çalışan koleksiyonu mutasyona uğratmaz, yeni bir akış veya sonuç üretir.
• **Lazy Evaluation (Tembel Değerlendirme):** Ara işlemler (`filter`, `map`) bir Soncul İşlem (`collect`, `count`) çağrılana kadar çalıştırılmaz.

---

🏗️ 2. Stream İşlem Adımları ⚙️

Bir Stream zinciri 3 temel aşamadan oluşur:

1. **Kaynak (Source):** Koleksiyondan Stream oluşturulur (`list.stream()`).
2. **Ara İşlemler (Intermediate Operations):** Akışı dönüştürür veya filtreler. Geriye yine bir `Stream` döner.
3. **Soncul İşlem (Terminal Operation):** Akışı kapatır ve nihayi sonucu (List, sayı, boolean vb.) üretir.

---

🛠️ 3. Sık Kullanılan Ara İşlemler (Intermediate Operations) 🧰

### A. `filter(Predicate)`
Belirli bir koşulu sağlayan elemanları akışta tutar, sağlamayanları eler.

### B. `map(Function)`
Akıştaki her bir elemanı dönüştürür veya işler (Örn: String'leri büyük harfe çevirme, nesneden tek bir alan çekme).

### C. `sorted()`
Akıştaki elemanları doğal sıralamasına veya belirlediğiniz bir `Comparator`'a göre sıralar.

### D. `distinct()`
Akıştaki tekrar eden (duplicate) elemanları kaldırır.

---

🎯 4. Sık Kullanılan Soncul İşlemler (Terminal Operations) 🏁

### A. `collect(Collectors.toList())`
Akıştaki elemanları yeni bir `List`, `Set` veya `Map` olarak toplar.

### B. `forEach(Consumer)`
Akıştaki her eleman için bir işlem yürütür.

### C. `count()`
Akıştaki eleman sayısını döner.

### D. `reduce()`
Akıştaki tüm elemanları birleştirerek tek bir değer üretir (Örn: Toplam veya Çarpım hesabı).

---

🧪 5. Kapsamlı Stream API Uygulama Örneği 🚀

Gelin bir Şirket Çalışanları listesinde filtreleme, dönüştürme ve sıralama senaryosunu uygulayalım.

### Çalışan Sınıfı (`Calisan.java`):

public class Calisan {
private String isim;
private String departman;
private double maas;

public Calisan(String isim, String departman, double maas) {
this.isim = isim;
this.departman = departman;
this.maas = maas;
}

public String getIsim() { return isim; }
public String getDepartman() { return departman; }
public double getMaas() { return maas; }

@Override
public String toString() {
return isim + " (" + departman + ") - " + maas + " TL";
}
}

### Stream İşlemleri (`Main.java`):

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
public static void main(String[] args) {
List<Calisan> calisanlar = Arrays.asList(
new Calisan("Ahmet", "Yazılım", 85000),
new Calisan("Ayşe", "Yazılım", 95000),
new Calisan("Mehmet", "IK", 50000),
new Calisan("Can", "Pazarlama", 60000),
new Calisan("Elif", "Yazılım", 110000)
);

System.out.println("--- Senaryo 1: Yazılım Departmanında Maaşı 90.000 TL Üzeri Olanlar ---");
List<Calisan> yuksekMaasliYazilimcilar = calisanlar.stream()
.filter(c -> c.getDepartman().equals("Yazılım"))
.filter(c -> c.getMaas() > 90000)
.collect(Collectors.toList());

yuksekMaasliYazilimcilar.forEach(System.out::println);


System.out.println("\n--- Senaryo 2: Tüm Çalışanların Sadece İsimlerini Büyük Harfle Listeleme ---");
List<String> isimler = calisanlar.stream()
.map(c -> c.getIsim().toUpperCase())
.sorted()
.collect(Collectors.toList());

System.out.println("İsimler: " + isimler);


System.out.println("\n--- Senaryo 3: Tüm Çalışanların Maaş Toplamı ve Ortalaması ---");
double toplamMaas = calisanlar.stream()
.mapToDouble(Calisan::getMaas)
.sum();

double ortalamaMaas = calisanlar.stream()
.mapToDouble(Calisan::getMaas)
.average()
.orElse(0.0);

System.out.println("Toplam Maaş : " + toplamMaas + " TL");
System.out.println("Ortalama Maaş : " + ortalamaMaas + " TL");
}
}

---

⚡ 6. Parallel Streams İle Performans Artışı 🏎️

Büyük veri kümelerinde birden fazla CPU çekirdeğini aynı anda kullanmak için `.stream()` yerine **`.parallelStream()`** kullanılır. Java veriyi parçalara bölerek paralel olarak işler.

long sayi = calisanlar.parallelStream()
.filter(c -> c.getMaas() > 70000)
.count();

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Stream API mimarisini, Ara (`filter`, `map`, `sorted`) ve Soncul (`collect`, `sum`, `count`) işlemleri ve `parallelStream` yapısını öğrendik.

👉 **Bölüm 20'de Bizi Ne Bekliyor? (FİNAL BÖLÜMÜ)**
• Serinin Muhteşem Finali: **`Optional<T>` Sınıfı, Multithreading Giriş ve Katmanlı Mimari İle Proje Geliştirme** 🏆
• `NullPointerException` Belasından Kurtulma (`Optional`)
• Java'da Eşzamanlı Çalışma (`Thread` ve `Runnable`)
• Tüm Kon
uları Kapsayan Konsol Tabanlı **Banka / Sanal Market Uygulaması**

Sorularınızı konu altından iletebilirsiniz. Serimizin FİNAL bölümünde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,703Mesajlar
326,233Kullanıcılar
membiSon Üye
Üst Alt