Rumah  >  Artikel  >  Java  >  Bagaimana untuk Melaksanakan Pengumpulan Bersarang dalam Java Menggunakan Collectors.groupingBy dalam Java 8?

Bagaimana untuk Melaksanakan Pengumpulan Bersarang dalam Java Menggunakan Collectors.groupingBy dalam Java 8?

Barbara Streisand
Barbara Streisandasal
2024-10-24 08:54:30254semak imbas

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

Kumpulan Bersarang (Berbilang Tahap) Oleh dalam Java 8

Keperluan sering timbul untuk melaksanakan pengumpulan objek berbilang peringkat berdasarkan berbilang kunci . Dalam kes ini, kami mempunyai satu set kelas yang mewakili data yang melibatkan senarai item dengan kunci dan senarai subitem, juga dengan kunci. Matlamatnya adalah untuk mengumpulkan item mengikut kuncinya dan untuk setiap pengagregatan, kumpulkan lagi subitem mengikut kuncinya, menghasilkan peta bersarang.

Menggunakan Java 8's Collectors.groupingBy, kita boleh mencapainya dengan menggunakan gabungan daripada flatMap dan pengumpul pemetaan rata tersuai. Kita mulakan dengan mencipta pasangan sementara menggunakan Stream.flatMap untuk menyimpan gabungan item dan subitem.

<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>

Sebagai alternatif, kita boleh mengelak daripada mencipta objek sementara dengan menggunakan pengumpul pemetaan rata, yang malangnya tidak akan tersedia sehingga Java 9. Dengan pendekatan ini, kod dipermudahkan kepada:

<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>

Untuk pengguna yang mungkin tidak mahu menunggu Java 9, pengumpul pemetaan rata tersuai boleh dilaksanakan:

<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>

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengumpulan Bersarang dalam Java Menggunakan Collectors.groupingBy dalam Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn