-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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:
rintln);
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! ☕✨
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:
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