21 Mayıs 2018 Pazartesi

Collectors Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.stream.Collectors;
Sınıf hazır tanımlı Collector nesneleri için factory gibi çalışır. Açıklaması şöyle
Collect is an extremely useful terminal operation to transform the elements of the stream into a different kind of result, e.g. a List, Set or Map. Collect accepts a Collector which consists of four different operations: a supplier, an accumulator, a combiner and a finisher. This sounds super complicated at first, but the good part is Java 8 supports various built-in collectors via the Collectors class. So for the most common operations you don't have to implement a collector yourself.
Collection Yaratan Metodlar
Bu metodlar toX() şeklindedir
- toMap() - keyMapper + valueMapper
- toMap() - keyMapper + valueMapper + Merge Function - Duplicate değerler varsa
- toSet()

Bölümleyen Metodlar
- groupingBy()

Tekil Hale Getiren Metodlar
Bu metodlar ing() son eki ile bitiyor
- joining()
- reducing ()
- teeing()

Max/Min Metodlar

Summing Metodlar
Bu metodlar summingX() şeklindedir.
- summingInt()
- summingDouble()
- summingLong()

Averaging Metodlar
Bu metodlar averagingX() şeklindedir.
averagingInt()
averagingDouble()
averagingLong()

Summarizing Metodlar
- summarizingInt() - IntSummaryStatistics döner

averagingDouble
Şöyle yaparız.
Double[] x = {5.4, 5.56, 1.0};
double avg = Arrays.stream(x).collect(Collectors.averagingDouble(n -> n));
collectingAndThen metodu
Collectors collectingAndThen metodu yazısına taşıdım

flatMapping metodu
Collectos flatMapping metodu yazısına taşıdım.

joining metodu - delimeter
Collectors.joining metodu yazısına taşıdım

groupingBy metodu - classifier yani keyMapper
Collectors groupingBy metodu - Map of List yazısına taşıdım.

groupingBy metodu - classifier yani keyMapper + downstream yani Collector
Collectors groupingBy metodu - Map of Collector yazısına taşıdım.

groupingBy metodu - classifier yani keyMapper + mapFactory + downstream yani Collector
Collectors groupingBy metodu - İstenilen Map Tipi of Collector yazısına taşıdım.

groupingBy metodu groupingBy
İç içe gruplamayı sağlar. İlk groupingBy Map<String,...> yapısını oluşturur. İkinci groupingBy içteki Map<String,...> yapısını oluşturur
Map<String, Map<String, List<Student>>> map= studs.collect(Collectors.groupingBy(
Student::getName,Collectors.groupingBy(Student::getLocation)));
groupingBy metodu+ collectionAndThen
Stream'deki nesneleri bir Map içine gruplar. Daha sonra Map'teki her bir elemanı bir kere daha dönüştürme imkanı tanır.

Elimizde bir Task ve Task'lara ait Job nesneleri olsun.
public class Task { int taskId; List<Job> jobList; }
Her Job ise bir agent tarafından çalıştırılabiliyor olsun.
// in class Job
int getAgentId() { // return the "agent" who is responsible for @param job }
Her agent'a düşen task'ları şöyle gruplamak isteyelim
// in class Partition; `Integer` for "agent" id
Map<Integer, Task> partition(Task task) { }
Şöyle yaparız.
task.getJobList().stream()
    .collect(
        groupingBy(
             Job::getAgentId,//agentID -> Job map
             collectingAndThen(toList(), jobs -> new Task(id, jobs))));
mapping metodu
Şu satırı dahil ederiz.
import static java.util.stream.Collectors.mapping;
Örnek
Elimizde şöyle bir map olsun.
ImmutableListMultimap<String, Character> immutableMultiMap
Bu yapıyı şuna çevirmek isteyelim.
Map<String, List<Character>> result
Şöyle yaparız. mapping ile her eleman Map içindeki Entry<String,Character> yapısından kurtulup List<Character> yapısına dönüşür.
Map<String, List<Character>> result = immutableMultiMap.entries().stream()
  .collect(groupingBy(Entry::getKey, TreeMap::new,
           mapping(Entry::getValue, toList())));

reducing metodu
Tüm elemanları bir işleme sokarak tek sonuç döner.
Örnek
Aynı değere sahip iki metod varsa null dönmesi için şöyle yaparız.
Optional<String> res = list.stream()
    .filter(item -> item.startsWith("A"))
    .limit(2)
    .collect(Collectors.reducing((s1, s2) -> null));
teeing metodu
Collectors.teeing metodu yazısına taşıdım






























Hiç yorum yok:

Yorum Gönder