8 Ekim 2019 Salı

Collectors.flatMapping metodu

Giriş
Java 9 ile geliyor. Yeni bir Collector döner. Yani aynı Collectors.toList() gibidir. 

Bu yeni Collectors metodlarının amacı bir sürü geçici nesne oluşmasının önüne geçmek. Böylece daha verimli kod yazılması mümkün.

flatMapping metodu - Stream + Collector

Örnek
Şöyle yaparız. Sonuç olarak [1, 2, 3, 4] alırız
List<List<Integer>> list2d = List.of(List.of(1, 2), List.of(3, 4));
List<Integer> lst1 = list_2d
    .stream()
    .collect(Collectors.flatMapping (List::stream, Collectors.toList()));
Bu kod aslında şununla işlev olarak aynı. Anca Stream.flatMap() bir sürü geçici stream tipinden nesne yararıyor. Bu yüzden verimsiz.
List<List<Integer>> list_2d = List.of(List.of(1, 2), List.of(3, 4));

List<Integer> lst1 = list_2d
    .stream()
    .flatMap(arr -> arr.stream())
    .collect(Collectors.toList());
printAll(lst1); // [1, 2, 3, 4]
Örnek - groupingBy() 
Elimizde şöyle bir kod olsun
public class WorkExperience {
  private int year;
  private List<Skills> skill;
  ...
}
Bu sınıfın listesi olsun. Aynı yıla ait tüm Skill'leri gruplamak isteyelim.
List<WorkExperience> workExperienceList = ...;
Her yıla göre Skill nesnelerini gruplamak için şöyle yaparız.
Map<Integer, Set<Skills>> map = workExperienceList.stream()
  .collect(Collectors.groupingBy(
              WorkExperience::getYear, 
              Collectors.flatMapping(workexp -> workexp.getSkill().stream(), 
                                   Collectors.toSet())));
Örnek - groupingBy() 
Elimizde şöyle bir kod olsun. Aynı kişiye ait tüm adresleri gruplamak isteyelim.
class Person {
    String name;
    int age;
    List<Address> address;
}

class Address {
    String street;
    String city;
    String country;
}
Şöyle yaparız.
Map<Person, List<Address>> resultSet = findPerson.stream()
    .collect(
        Collectors.groupingBy(
            Function.identity(),
            Collectors.flatMapping(
                p -> p.getAddress().stream(), 
                Collectors.toList()
            )
        )
    )
;

Hiç yorum yok:

Yorum Gönder