그룹화 할 임의의 수의 속성을 사용하여 함수를 생성하여 groupingBy
- Collector
을 반복하여 각각의 이전 버전을 downstream
콜렉터로 전달할 수 있습니다. grouper
기능의 순서는 반대 순서로 통과해야하므로 (또는 함수 내에서 그 역 예를 들어, Collections.reverse
를 사용하거나 구아바의 Lists.reverse
, 당신이 선호하는 중), 반전 것을
public static <T> Map collectMany(List<T> data, Function<T, ?>... groupers) {
Iterator<Function<T, ?>> iter = Arrays.asList(groupers).iterator();
Collector collector = Collectors.groupingBy(iter.next());
while (iter.hasNext()) {
collector = Collectors.groupingBy(iter.next(), collector);
}
return (Map) data.stream().collect(collector);
}
참고. 기능의 배열을 반대로 오래된 학교에 for
루프를 사용하여
Object groupedData = collectMany(data, Person::getTown, Person::getCountry, Person::getName);
또는 같은
는, 당신은 반대 순서로 능성어를 통과하지 않아도 즉, (그러나 이럴이 이해하기 어렵습니다) :
public static <T> Map collectMany(List<T> data, Function<T, ?>... groupers) {
Collector collector = Collectors.groupingBy(groupers[groupers.length-1]);
for (int i = groupers.length - 2; i >= 0; i--) {
collector = Collectors.groupingBy(groupers[i], collector);
}
return (Map) data.stream().collect(collector);
}
두 가지 방법 모두 원래 코드와 마찬가지로 Map<?,Map<?,Map<?,T>>>
을 반환합니다. 해당 데이터로 수행하려는 작업에 따라 Tunaki과 같이 Map<List<?>,T>
을 사용하는 것이 좋습니다.
"때로는 이름과 마을별로 가끔 속성으로 묶고 싶습니다." - 사용자 입력 또는 무엇에 따라? – Smutje
참고 http://stackoverflow.com/a/34772639/1587046 –