Kumpulan Bersarang (Berbilang Tahap) Oleh dalam Java 8
Keperluan sering timbul untuk melaksanakan pengumpulan objek berbilang peringkat berdasarkan berbilang kunci . Dalam kes ini, kami mempunyai satu set kelas yang mewakili data yang melibatkan senarai item dengan kunci dan senarai subitem, juga dengan kunci. Matlamatnya adalah untuk mengumpulkan item mengikut kuncinya dan untuk setiap pengagregatan, kumpulkan lagi subitem mengikut kuncinya, menghasilkan peta bersarang.
Menggunakan Java 8's Collectors.groupingBy, kita boleh mencapainya dengan menggunakan gabungan daripada flatMap dan pengumpul pemetaan rata tersuai. Kita mulakan dengan mencipta pasangan sementara menggunakan Stream.flatMap untuk menyimpan gabungan 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>
Sebagai alternatif, kita boleh mengelak daripada mencipta objek sementara dengan menggunakan pengumpul pemetaan rata, yang malangnya tidak akan tersedia sehingga Java 9. Dengan pendekatan ini, kod 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>
Untuk pengguna yang mungkin tidak mahu menunggu Java 9, pengumpul pemetaan rata tersuai boleh dilaksanakan:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengumpulan Bersarang dalam Java Menggunakan Collectors.groupingBy dalam Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!