Modül dersleri (2/2)
Akış API'si
Java'daki Stream API, işlevsel programlamadan yararlanarak nesne koleksiyonlarını bildirimsel bir şekilde işlemenize olanak tanır. Akış veri depolamaz, bunun yerine bir kaynaktan (liste veya dizi gibi) öğeleri bir işlem hattı aracılığıyla taşır.
Stream işlem hattı üç bölümden oluşur:
- Bir kaynak (ör.
list.stream()) - Sıfır veya daha fazla ara işlemler (yeni bir Akış döndüren, örneğin
filter,map) - terminal işlemi (nihai bir sonuç veya yan etki üreterek Akışı kapatır, örneğin
collect,forEach,reduce)
Ortak Ara İşlemler
Ara işlemler tembeldir: bir terminal işlemi çağrılıncaya kadar yürütülmezler.
filter(Predicate): öğeleri bir boole koşuluna göre filtreler.map(Function): her öğeyi bir işlev uygulayarak başka bir nesneye dönüştürür.sorted(): Akışın öğelerini sıralar.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"Ortak Terminal İşlemleri
forEach(Consumer): Akışın her öğesi için bir eylem gerçekleştirir.collect(Collector): Akış sonuçlarını bir kapsayıcıda toplar (örneğin,Collectors.toList()kullanan bir liste).reduce(identity, BinaryOperator): Akış öğelerini tek bir kümülatif değerde birleştirir.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10Kendin dene
Yalnızca çift sayıları filtrelemek için sayıların akışını kullanarak kodu tamamlayın, bunları çiftler adlı yeni bir Listede toplayın ve System.out.println'yi kullanarak yazdırın.
İpucu göster
`numbers.stream()` çağırarak başlayın, `.filter(n -> n % 2 == 0)` ekleyin ve son olarak `.collect(Collectors.toList())` ile toplayın.
3 denemeden sonra çözüm mevcut
Haritayı kullanarak ad listesindeki tüm adları büyük harfe dönüştürmek için akışları kullanın ve bunları bir yöntem referansıyla forEach kullanarak birer birer yazdırın.
İpucu göster
`.map(s -> s.toUpperCase())` komutunu ve ardından `.forEach(System.out::println)` terminal işlemini kullanın.
3 denemeden sonra çözüm mevcut
Akış ve azaltma terminal işlemini kullanarak, başlangıç değeri 0 olan sayı listesindeki tüm sayıların toplamını hesaplayarak kodu tamamlayın. Toplamı yazdırın.
İpucu göster
'numbers.stream().reduce(0, (a, b) -> a + b)' komutunu kullanın ve elde edilen değişkeni yazdırın.
3 denemeden sonra çözüm mevcut