>  기사  >  Java  >  Java 8에서 Collectors.groupingBy를 사용하여 Java에서 중첩 그룹화를 구현하는 방법은 무엇입니까?

Java 8에서 Collectors.groupingBy를 사용하여 Java에서 중첩 그룹화를 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-24 08:54:30163검색

How to Implement Nested Grouping in Java Using Collectors.groupingBy in Java 8?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.