6 Ocak 2020 Pazartesi

Collectors partitioningBy metodu

Giriş
Açıklaması şöyle. groupingBy() metodu ile çok benzer. groupingBy() girdiyi ikiden fazla alana bölebilir. partitioningBy iki alana böler.
This is like groupingBy, but instead of passing a function to specify the key, we pass a predicate which determines the key (true or false) for each value. In the single parameter version, values that share the same key are organised into a generic list, where as in the two parameter version we can specify the collection type for the values.
Örnek
Bir diziyi tek ve çift olarak ikiye bölmek için şöyle yaparız.
Map<Boolean, List<Integer>> oddAndEvenMap = numbers.stream()
        .collect(Collectors.partitioningBy(n -> n % 2 == 0));
final List<Integer> even = oddAndEvenMap.get(true);
final List<Integer> odd = oddAndEvenMap.get(false);
Aynı şeyi 3'e bölmek için şöyle yaparız.
Function<Integer, Integer> fun =  i -> i%3;
List<Integer> a = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Map<Integer, List<Integer>> collect = a.stream().collect(Collectors.groupingBy(fun));

System.out.println(collect);
//{0=[3, 6, 9], 1=[1, 4, 7, 10], 2=[2, 5, 8]}
Örnek
4'ten küçük ve büyük olanları bölmek için şöyle yaparız.
int[] v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int k = 4;
Map<Boolean, List<Integer>> partitions = Arrays.stream(v)
  .boxed()
  .filter(n -> n != k)
  .collect(Collectors.partitioningBy(n -> n < k));
Örnek
Belli bir tarihten önce ve sonra olanları bölmek için şöyle yaparız.
Map<Boolean, List<Employee>> listMap = employeeList.stream()
  .collect(Collectors.partitioningBy(e -> e.joiningDate.isAfter(specificDate)));

List<Employee> employeeListAfter = listMap.get(true);
List<Employee> employeeListBefore = listMap.get(false);
Örnek
myMap elemanlarının myList içinde olup olmamasına göre bölümlemek için şöyle yaparız.
Map<String, String> myMap = new HashMap<>();
myMap.put("d", "D");
myMap.put("c", "C");
myMap.put("b", "B");
myMap.put("A", "A");

List<String> myList = Arrays.asList("a", "b", "c");

Map<Boolean, Map<String, String>> result = myMap.entrySet()
        .stream()
        .collect(Collectors.partitioningBy(
                            entry -> myList.contains(entry.getKey()),
                            Collectors.toMap(Entry::getKey, Entry::getValue)
                    )
        );

Hiç yorum yok:

Yorum Gönder