Rumah > Java > javaTutorial > teks badan

Bagaimana untuk Melaksanakan Pengumpulan Berbilang Tahap dengan Objek Bersarang dalam Java 8?

Patricia Arquette
Lepaskan: 2024-10-24 08:47:30
asal
709 orang telah melayarinya

How to Implement Multi-Level Grouping with Nested Objects in Java 8?

Pengumpulan Berbilang Tahap dalam Java 8 Menggunakan Nested GroupBy

Artikel ini meneroka cara melaksanakan pengelompokan berbilang peringkat apabila berurusan dengan kelas bersarang dalam Java 8. Secara khusus, matlamatnya adalah untuk mengumpulkan item mengikut medan key1 dan kemudian, untuk setiap kumpulan item, kumpulannya lagi mengikut medan key2. Akhirnya, output hendaklah peta dengan kunci1 sebagai kunci luar dan peta kunci2 kepada senarai subitem.

Pendekatan awal cuba menggunakan kaedah Collectors.groupingBy untuk mencapai ini, bagaimanapun, ia adalah tidak mungkin untuk mengumpulkan satu item dengan berbilang kunci secara langsung. Untuk mengatasinya, operasi flatMap digunakan.

Satu kaedah melibatkan mencipta pasangan sementara menggunakan Map.entrySet untuk menahan gabungan item dan subitem sebelum mengumpul. Pendekatan lain, tersedia dalam Java 9, memanfaatkan pengumpul flatMapping, yang membolehkan melaksanakan operasi flatMap terus dalam pengumpul.

Inilah penyelesaian flatMap:

<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
    .flatMap(item -> item.getSubItems().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

Alternatif menggunakan tersuai pengumpul dalam Java 8:

<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

Pengumpul tersuai ini boleh digunakan seperti berikut:

<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

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengumpulan Berbilang Tahap dengan Objek Bersarang 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!