Rumah > Java > javaTutorial > teks badan

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

Barbara Streisand
Lepaskan: 2024-10-24 08:54:30
asal
253 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan