Java 8의 중첩된(다중 수준) 그룹화
여러 키를 기반으로 객체의 다단계 그룹화를 수행해야 하는 경우가 종종 발생합니다. . 이 경우 키가 있는 항목 목록과 키가 있는 하위 항목 목록과 관련된 데이터를 나타내는 클래스 세트가 있습니다. 목표는 항목을 키별로 그룹화하고 각 집계에 대해 키별로 하위 항목을 추가로 그룹화하여 중첩 맵을 만드는 것입니다.
Java 8의 Collectors.groupingBy를 사용하면 다음 조합을 사용하여 이를 달성할 수 있습니다. flatMap 및 사용자 정의 평면 매핑 수집기. 항목과 하위 항목의 조합을 보관하기 위해 Stream.FlatMap을 사용하여 임시 쌍을 만드는 것부터 시작합니다.
<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까지 사용할 수 있습니다. 이 접근 방식을 사용하면 코드가 다음과 같이 단순화됩니다.
<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를 기다리고 싶지 않은 사용자의 경우 사용자 정의 평면 매핑 수집기를 구현할 수 있습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!