> Java > java지도 시간 > 본문

Java 8의 여러 속성을 기반으로 중첩 그룹화를 수행하는 방법

DDD
풀어 주다: 2024-10-24 08:39:02
원래의
244명이 탐색했습니다.

How to Perform Nested Grouping based on Multiple Properties in Java 8

복잡한 객체 구조를 위한 Java 8의 중첩 그룹화

Java 8에서 Collectors.groupingBy 메소드는 항목을 기반으로 그룹화하는 강력한 방법을 제공합니다. 특정 속성에 대해. 이를 통해 데이터를 효율적으로 집계하고 요약할 수 있습니다. 그러나 수행할 그룹화 수준이 여러 개인 시나리오는 어떻습니까?

다음 클래스 구조를 고려하십시오.

<code class="java">class Pojo {
    List<Item> items;
}

class Item {
    T key1;
    List<SubItem> subItems;
}

class SubItem {
    V key2;
    Object otherAttribute1;
}</code>
로그인 후 복사

목표는 키1을 기준으로 항목을 그룹화한 다음 각 항목에 대해 그룹화하는 것입니다. 항목 그룹, key2를 기반으로 하는 추가 그룹 하위 항목. 원하는 출력은 다음 형식의 맵입니다.

<code class="java">Map<T, Map<V, List<SubItem>>></code>
로그인 후 복사

이 시나리오에서는 표준 Collectors.groupingBy를 사용하는 것만으로는 충분하지 않습니다. 문제는 단일 항목을 여러 키로 그룹화하는 것입니다.

해결책: 구조 평면화

이 문제를 해결하는 열쇠는 구조를 일시적으로 평면화하는 것입니다. 이렇게 하면 필요한 그룹화를 수행하기 전에 항목과 하위 항목의 조합 스트림을 생성할 수 있습니다.

한 가지 접근 방식은 Stream.FlatMap 메서드를 사용하여 Map.Entry 객체의 스트림을 생성하는 것입니다. 항목과 하위 항목 쌍을 나타냅니다.

<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>
로그인 후 복사

Collectors.FlatMapping을 사용하는 대체 솔루션(Java 9 )

Java 9 이상에서는 더 우아한 접근 방식이 있습니다. Collectors.FlatMapping 컬렉터를 사용하여 사용 가능:

<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 8 이상의 복잡한 객체 구조.

위 내용은 Java 8의 여러 속성을 기반으로 중첩 그룹화를 수행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿