Rumah  >  Artikel  >  Java  >  Cara Melakukan Pengumpulan Bersarang berdasarkan Pelbagai Sifat dalam Java 8

Cara Melakukan Pengumpulan Bersarang berdasarkan Pelbagai Sifat dalam Java 8

DDD
DDDasal
2024-10-24 08:39:02174semak imbas

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>

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>

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>

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>

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!

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