CodeBlanks Logo Icon CodeBlanks

Stream katmanı

Stream ve lambda ile veri işleme kurarsın.

Stream ile büyük siparişleri bul

OrderBook sınıfına largeOrders metodu ekleyeceğiz. Bu metot orders.stream().filter(o -> o.amount >= 100).collect(Collectors.toList()) zinciri ile tutarı 100 ya da üstü olan siparişleri yeni bir listeye toplar.

filter bir Predicate bekler; o -> o.amount >= 100 lambda'sı her sipariş için koşulu sınar. collect(Collectors.toList()) terminal işlemi eşleşen siparişleri yeni bir List<Order> olarak döndürür. Orijinal liste değişmez.

collect(Collectors.toList())

collect(Collectors.toList()) terminal işlemi, akıştaki eşleşen elemanları yeni bir List olarak toplar. Sonuç değiştirilebilir bir listedir; akış kaynağı etkilenmez. Java 16'dan beri .toList() kısa yolu da vardır.

largeOrders metodu List<Order> döndürür; bu liste üzerinde başka işlemler yapılabilir. Örneğin book.largeOrders().size() kaç büyük sipariş olduğunu verir. Her çağrı yeni bir liste üretir.

Uygulama largeOrders metodunu ekle

Üstteki Order ve OrderBook sınıflarına largeOrders metodunu ekle: List<Order> largeOrders() { return orders.stream().filter(o -> o.amount >= 100).collect(Collectors.toList()); }. main içinde OrderBook book = new OrderBook(); oluştur, üç sipariş ekle: "1", "Ayşe", 50, "2", "Alex", 150, "3", "Mehmet", 200. System.out.println(book.largeOrders().size()); ile büyük sipariş sayısını yazdır.

Başlangıç kodu

Main.java
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

class Order {
    String id;
    String customer;
    int amount;
    Order(String id, String customer, int amount) {
        this.id = id;
        this.customer = customer;
        this.amount = amount;
    }
}

class OrderBook {
    List<Order> orders = new ArrayList<>();
    void add(Order o) { orders.add(o); }
    void listAll() {
        orders.forEach(o -> System.out.println(o.id + " " + o.customer + " " + o.amount));
    }
}

// OrderBook sınıfına largeOrders metodunu ekle

// main: bir OrderBook oluştur, üç sipariş ekle, largeOrders boyutunu yazdır

Örnek çözüm

Main.java
class Order {
    String id;
    String customer;
    int amount;
    Order(String id, String customer, int amount) {
        this.id = id;
        this.customer = customer;
        this.amount = amount;
    }
}

class OrderBook {
    List<Order> orders = new ArrayList<>();
    void add(Order o) { orders.add(o); }
    void listAll() {
        orders.forEach(o -> System.out.println(o.id + " " + o.customer + " " + o.amount));
    }
    List<Order> largeOrders() {
        return orders.stream().filter(o -> o.amount >= 100).collect(Collectors.toList());
    }
}

public class Main {
    public static void main(String[] args) {
        OrderBook book = new OrderBook();
        book.add(new Order("1", "Ayşe", 50));
        book.add(new Order("2", "Alex", 150));
        book.add(new Order("3", "Mehmet", 200));
        System.out.println(book.largeOrders().size());
    }
}

Beklenen çıktı

2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 largeOrders metodunda filter ne bekler?

  • Runnable
  • Consumer
  • Function
  • Predicate Doğru cevap

Açıklama: filter bir Predicate<Order> bekler; boolean döner.

2 filter lambda'sını tamamla

Soru
orders.stream().filter(____ -> o.amount >= 100)
Cevap
orders.stream().filter(o -> o.amount >= 100)

Açıklama: filter lambda parametresi tek harfle de yazılabilir.

3 Stream zinciri parçalarını eşleştir

Kavram Anlamı
stream() Akışı başlatır
filter(...) Koşulu sağlayanları tutar
collect(...) Listeye toplar
Collectors.toList() Liste üretir

Orta seviye bölümündeki tüm dersler