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!