Stream API (Java 8+), koleksiyonların fonksiyonel tarzda işlenmesini sağlar — verinin filtrelenmesi, dönüştürülmesi ve toplandığı bir işlem hattı aracılığıyla, açık döngüler (nasıl) yerine bildirimsel olarak ifade edilen (ne yapacak).
Zorunlu vs Stream stili
// ❌ imperative — explicit loop, mutable accumulator
List<String> result = new ArrayList<>();
for (Person p : people) {
if (p.getAge() >= 18) {
result.add(p.getName().toUpperCase());
}
}
// ✅ stream — declarative pipeline, reads like a description of the transformation
List<String> result = people.stream()
.filter(p -> p.getAge() >= 18) // keep adults
.map(p -> p.getName().toUpperCase()) // extract + transform names
.collect(Collectors.toList()); // gather into a list
Stream versiyonu, amaçları bir işlem zinciri olarak açıkça ifade eder, manuel döngü veya biriktiricisiz.
Pipeline yapısı
Source → Intermediate operations (lazy) → Terminal operation (triggers execution)
stream() // source
.filter(...) .map(...) // intermediate — lazy, return a new stream, chainable
.collect(...) // terminal — produces a result, RUNS the pipeline
Ara işlemler (filter, map, sorted, distinct) tembel — işlem hattını oluştururlar, ancak bir terminal işlemi (collect, forEach, reduce, count) onu tetikleyene kadar yürütülmez.
Yaygın işlemler
list.stream()
.filter(x -> x > 0) // keep matching
.map(x -> x * 2) // transform each
.sorted() // sort
.distinct() // remove duplicates
.limit(10) // take first 10
.collect(Collectors.toList());
// aggregations
int sum = nums.stream().mapToInt(Integer::intValue).sum();
long count = list.stream().filter(...).count();
Optional<Person> first = people.stream().filter(...).findFirst();
boolean any = list.stream().anyMatch(x -> x > 100);
// grouping (very powerful)
Map<String, List<Person>> byCity =
people.stream().collect(Collectors.groupingBy(Person::getCity));
reduce — tek bir değere katlama
int total = nums.stream().reduce(0, (a, b) -> a + b); // sum via reduction
Paralel akışlar
list.parallelStream().filter(...).collect(...); // process across multiple cores
// ⚠️ use only for large data + independent/stateless operations; measure first
Neden önemli
Stream API, Java'nın verileri nasıl işlediğini dönüştürdü — ayrıntılı, hataya eğilimli döngüleri, filtreleme, eşleme, sıralama, gruplama ve toplama için özlü, okunabilir, bildirimsel işlem hatları ile değiştirdi.
Modern Java'da veri işleme için yaygın şekilde kullanılır, kodun amacını daha net hale getirir ve lambda'lar ve metot referansları ile fonksiyonel bir stil için entegre olur.
Tembel ara / istekli terminal modelini, yaygın işlemleri (filter/map/collect/reduce/groupingBy) ve paralel akışlar seçeneğini (uyarılarıyla birlikte) anlamak, idiyomatik modern Java yazması için gereklidir.
Akışlar hem bir üretkenlik artışı hem de sık görülen bir mülakat konusudur ve bu durum, güncel Java uygulamalarında akıcılığı yansıtır.
