[ Oracle ] Collectors API
groupingBy
[Baeldung] Guide to Java 8 groupingBy Collector
// classifier를 이용해서 key를 뽑아내고, 해당하는 value를 list로 가짐 static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier); @Test void 학습_테스트() { Admin admin = new Admin("test@test.com", "abcd1234!@", Role.ADMIN, organization); Admin admin2 = new Admin("test@test.com", "abcd1234!@", Role.ADMIN, organization); Admin admin3 = new Admin("test@test.com", "abcd1234!@", Role.SUPERVISOR, organization); List<Admin> admins = List.of(admin, admin2, admin3); Map<Role, List<Admin>> results = admins.stream().collect( Collectors.groupingBy(Admin::getRole)); assertThat(results.get(Role.ADMIN)).hasSize(2); assertThat(results.get(Role.SUPERVISOR)).hasSize(1); }
// classifier를 이용해서 key를 추출, The downstream collector // operates on elements of type T and produces a result of type D. // The resulting collector produces a Map<K, D>. // downstream collector : 해당하는 stream에 대해 그 다음 연산을 적용함 static <T,K,A,D> Collector<T,?,Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream); @Test void 학습_테스트() { Admin admin = new Admin("test@test.com", "abcd1234!@", Role.ADMIN, organization); Admin admin2 = new Admin("test2@test.com", "abcd1234!@", Role.ADMIN, organization); Admin admin3 = new Admin("test3@test.com", "abcd1234!@", Role.SUPERVISOR, organization); List<Admin> admins = List.of(admin, admin2, admin3); Map<Role, List<String>> results = admins.stream().collect(Collectors.groupingBy( Admin::getRole, Collectors.mapping(Admin::getEmail, Collectors.toList())) ); assertThat(results.get(Role.ADMIN)).contains(admin.getEmail(), admin2.getEmail()); assertThat(results.get(Role.SUPERVISOR)).contains(admin3.getEmail()); }
static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
key를 Multi value로 하는 방법
public class BlogPost { private String title; private String author; private BlogPostType type; private int likes; record AuthPostTypesLikes(String author, BlogPostType type, int likes) {}; // constructor, getters/setters } Map<BlogPost.AuthPostTypesLikes, List<BlogPost>> postsPerTypeAndAuthor = posts.stream().collect(groupingBy( post -> new BlogPost.AuthPostTypesLikes( post.getAuthor(), post.getType(), post.getLikes() ) ));