Stream katmanı
- Java kursu
- Orta seviye
- Ders 114/116
- 6 dk
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
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
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
orders.stream().filter(____ -> o.amount >= 100)
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 |