Java 8의 중첩된(다중 수준) 그룹화
여러 키를 기반으로 객체의 다단계 그룹화를 수행해야 하는 경우가 종종 발생합니다. . 이 경우 키가 있는 항목 목록과 키가 있는 하위 항목 목록과 관련된 데이터를 나타내는 클래스 세트가 있습니다. 목표는 항목을 키별로 그룹화하고 각 집계에 대해 키별로 하위 항목을 추가로 그룹화하여 중첩 맵을 만드는 것입니다.
Java 8의 Collectors.groupingBy를 사용하면 다음 조합을 사용하여 이를 달성할 수 있습니다. flatMap 및 사용자 정의 평면 매핑 수집기. 항목과 하위 항목의 조합을 보관하기 위해 Stream.FlatMap을 사용하여 임시 쌍을 만드는 것부터 시작합니다.
1 2 3 4 5 6 | <code class = "java" >Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
.flatMap(item -> item.subItems.stream()
.map(sub -> new AbstractMap.SimpleImmutableEntry<>(item.getKey1(), sub)))
.collect(Collectors.groupingBy(AbstractMap.SimpleImmutableEntry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.groupingBy(SubItem::getKey2))));</code>
|
로그인 후 복사
또는 평면 매핑 수집기를 사용하여 임시 개체를 만드는 것을 피할 수 있습니다. Java 9까지 사용할 수 있습니다. 이 접근 방식을 사용하면 코드가 다음과 같이 단순화됩니다.
1 2 3 4 | <code class = "java" >Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
.collect(Collectors.groupingBy(Item::getKey1,
Collectors.flatMapping(item -> item.getSubItems().stream(),
Collectors.groupingBy(SubItem::getKey2))));</code>
|
로그인 후 복사
Java 9를 기다리고 싶지 않은 사용자의 경우 사용자 정의 평면 매핑 수집기를 구현할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | <code class = "java" > static <T,U,A,R> Collector<T, ?, R> flatMapping(
Function<? super T, ? extends Stream<? extends U>> mapper,
Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> acc = downstream.accumulator();
return Collector.of(downstream.supplier(),
(a, t) -> { try (Stream<? extends U> s=mapper.apply(t)) {
if (s!=null) s.forEachOrdered(u -> acc.accept(a, u));
}},
downstream.combiner(), downstream.finisher(),
downstream.characteristics().toArray( new Collector.Characteristics[0]));
}</code>
|
로그인 후 복사
위 내용은 Java 8에서 Collectors.groupingBy를 사용하여 Java에서 중첩 그룹화를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!