Rumah > Java > javaTutorial > teks badan

Cara Melakukan Pengumpulan Bersarang berdasarkan Pelbagai Sifat dalam Java 8

DDD
Lepaskan: 2024-10-24 08:39:02
asal
245 orang telah melayarinya

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

Pengumpulan Bersarang dalam Java 8 untuk Struktur Objek Kompleks

Dalam Java 8, kaedah Collectors.groupingBy menyediakan cara yang berkesan untuk mengumpulkan item berdasarkan pada sifat tertentu. Ini membolehkan anda mengagregat dan meringkaskan data dengan cekap. Namun, bagaimana pula dengan senario di mana anda mempunyai pelbagai peringkat pengelompokan untuk dilakukan?

Pertimbangkan struktur kelas berikut:

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

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

class SubItem {
    V key2;
    Object otherAttribute1;
}</code>
Salin selepas log masuk

Objektifnya adalah untuk mengumpulkan item berdasarkan kekunci1 dan kemudian, untuk setiap kumpulan item, subitem kumpulan selanjutnya berdasarkan key2. Output yang diingini ialah peta dalam bentuk:

<code class="java">Map<T, Map<V, List<SubItem>>></code>
Salin selepas log masuk

Menggunakan Pengumpul standard.groupingBy tidak akan mencukupi untuk senario ini. Cabarannya terletak pada mengumpulkan satu item dengan berbilang kunci.

Penyelesaian: Meratakan Struktur

Kunci untuk menyelesaikan masalah ini ialah meratakan struktur buat sementara waktu. Dengan berbuat demikian, anda boleh mencipta strim gabungan Item dan SubItem sebelum melakukan pengelompokan yang diperlukan.

Satu pendekatan ialah menggunakan kaedah Stream.flatMap untuk mencipta strim objek Map.Entry, di mana setiap entri mewakili sepasang 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

Penyelesaian Alternatif dengan Collectors.flatMapping (Java 9 )

Di Java 9 dan lebih tinggi, pendekatan yang lebih elegan ialah tersedia menggunakan pengumpul 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>
Salin selepas log masuk

Kesimpulan

Dengan memanfaatkan Aliran, Pengumpul dan perataan objek sementara, adalah mungkin untuk mencapai kumpulan bersarang walaupun untuk struktur objek kompleks dalam Java 8 dan seterusnya.

Atas ialah kandungan terperinci Cara Melakukan Pengumpulan Bersarang berdasarkan Pelbagai Sifat 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan