Rumah >Java >javaTutorial >Bagaimana untuk mengumpulkan Java 8 Objek Bersarang dengan Berbilang Kekunci Menggunakan Pengumpul?
Pengumpulan Berbilang Tahap Java 8 dengan Pengumpul Bersarang
Penghimpunan berbilang peringkat, juga dikenali sebagai kumpulan bersarang, melibatkan pengagregatan data dengan berbilang kunci merentas tahap hierarki objek bersarang yang berbeza. Dalam Java 8, anda boleh mencapai ini dengan bantuan Pengumpul bersarang.
Pertimbangkan senario di mana anda mempunyai kelas seperti Pojo, Item dan SubItem, di mana setiap Pojo mempunyai senarai Item dan setiap Item mempunyai senarai SubItem. Matlamatnya adalah untuk mengumpulkan Item mengikut medan kunci1 mereka dan untuk setiap kumpulan, mengagregatkan lagi SubItem mengikut medan kunci2 mereka.
Untuk melaksanakan pengumpulan bersarang ini, anda boleh menggunakan Collectors.groupingBy dengan struktur bersarang:
<code class="java">pojo.getItems() .stream() .collect( Collectors.groupingBy(Item::getKey1, **// How to group by SubItem::getKey2 here**));</code>
Persoalannya terletak pada parameter kedua Collectors.groupingBy - cara mengumpulkan SubItem mengikut key2 dalam setiap kumpulan key1. Penyelesaian itu tidak boleh menggunakan perkumpulan secara bertingkat, kerana ia hanya mengumpulkan mengikut medan dalam objek yang sama.
Jawapannya melibatkan penggunaan Stream.flatMap untuk mencipta aliran pasangan nilai kunci, dengan kuncinya ialah Item.key1 dan nilai ialah SubItem.key2. Strim ini kemudiannya dikumpulkan menggunakan Collectors.groupingBy untuk mencapai kumpulan bersarang yang diingini:
<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>
Sebagai alternatif, dengan Java 9's Collectors.flatMapping, penyelesaiannya 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>
Atas ialah kandungan terperinci Bagaimana untuk mengumpulkan Java 8 Objek Bersarang dengan Berbilang Kekunci Menggunakan Pengumpul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!