8 Ekim 2019 Salı

Collectors groupingBy metodu - Sadece Classifier - Map Of List Haline Getirir

Giriş
Şu satırı dahil ederiz.
import static java.util.stream.Collectors.groupingBy;
İmzası şöyle.
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) 
Açıklaması şöyle. Yani nesneyi kendi içindeki bir alana göre MultiMap (Map of List) haline getirir
Returns a Collector implementing a "group by" operation on input elements of type T, grouping elements according to a classification function, and returning the results in a Map.
groupingBy metodu - classifier yani keyMapper
Sadece keyMapper verilen groupingBy() metodunu çağırırsak Map'in ikinci parametresi her zaman List olur. List'in tipi nesnenin kendisidir. Yani bu metod bir nesneyi kendi içindeki bir alana göre çoklu bölümlere (multiple partitions) ayırmak için kullanılır.

Bu anlamda Collectors.groupingBy() ve Collectors.toMap() birbirlerinden ayrılırlar çünkü toMap() hem keyMapper hem de valueMapper nesnesi alır.

Örnek
Şöyle yaparız.
Map<A> result = list.stream()
    .collect(Collectors.groupingBy(A::getId,...))
    .values();
toMap ile şöyle yaparız.
Map<Integer, A> result = listOfA.stream()
    .collect(Collectors.toMap(A::getId, ..., ...));
Örnek
Value değerlerine göre gruplamak için şöyle yaparız.
Map<String, Integer> map = new HashMap<>();

map.put("cat", 1);
map.put("kid", 3);
map.put("girl", 3);
map.put("adult", 2);
map.put("human", 5);
map.put("dog", 2);
map.put("boy", 2);

Map<Integer, List<String>> newMap = map.keySet()
                                  .stream()
                                  .collect(Collectors.groupingBy(map::get));

System.out.println(newMap);

> {1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}

Hiç yorum yok:

Yorum Gönder