그룹화
Collectors.groupigBy
특정 기준에 따라 스트림의 요소를 그룹화 하여 Map으로 만들 수 있다.
Map<Dish.Type, List<Dish>> dishesByType = menus.stream()
.collect(Collectors.groupingBy(Dish::getType));
Java
복사
만약, 위와 같이 분류된 각각의 리스트에 필터링을 걸고 싶다면, Collectors.filtering()을 사용할 수 있다.
예를 들어 가격이 1000 이상인 것만 남기고 싶다면 다음과 같이 하면 된다.
Map<Dish.Type, List<Dish>> dishesByType = menus.stream()
.collect(
Collectors.groupingBy(Dish::getType,
Collectors.filtering(dish -> dishe.getPrice > 10000, Collectors.toList())));
Java
복사
만약, 위와 같이 분류된 각각의 리스트에 map 을 적용하고 싶다면, Collectors.mapping을 사용할 수 있다.
Map<Dish.Type, List<String>> dishesByType = menus.stream()
.collect(
Collectors.groupingBy(Dish::getType,
Collectors.mapping(dish::getName, Collectors.toList())));
Java
복사
위와 같이 코드를 작성하면 이름 리스트가 value인 map이 생성된다.
두번째 인자로 또 다른 groupBy를 넣으면, 여러 수준의 그룹화가 가능하다.
분할
Collectors.partitioningBy
스트림의 요소를 조건에 만족하는 그룹과, 그렇지 않은 그룹으로 나누는 것이다.
예를 들어, 짝수와 홀수를 그룹화 한다면 다음과 같이 할 수 있다.
Map<Boolean, List<Integer>> collect = IntStream.range(0, 1000000)
.boxed()
.collect(Collectors.partitioningBy(integer -> integer % 2 == 0));
Java
복사