복잡한 객체 구조를 위한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!