التجميع متعدد المستويات في Java 8 باستخدام Nested GroupBy
تستكشف هذه المقالة كيفية تنفيذ التجميع متعدد المستويات عند التعامل مع الفئات المتداخلة في Java 8. على وجه التحديد، الهدف هو تجميع العناصر حسب حقل key1، ثم، لكل مجموعة من العناصر، تجميعها حسب حقل key2. في النهاية، يجب أن يكون الإخراج خريطة مع key1 كمفتاح خارجي وخريطة key2 لقائمة العناصر الفرعية.
يحاول النهج الأولي استخدام طريقة Collectors.groupingBy لتحقيق ذلك، ومع ذلك، فهو كذلك لا يمكن تجميع عنصر واحد بواسطة مفاتيح متعددة مباشرة. للتغلب على ذلك، يتم استخدام عملية flatMap.
تتضمن إحدى الطرق إنشاء زوج مؤقت باستخدام Map.entrySet للاحتفاظ بمجموعات من العناصر والعناصر الفرعية قبل التجميع. يعمل النهج الآخر، المتوفر في Java 9، على الاستفادة من مُجمِّع flatMapping، الذي يتيح إجراء عملية flatMap مباشرة في المُجمِّع.
إليك حل flatMap:
Map>> 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))));
بديل باستخدام أداة تجميع مخصصة في Java 8:
static Collector flatMapping(
Function super T,? extends Stream extends U>> mapper,
Collector super U,A,R> downstream) {
BiConsumer 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]));
}
يمكن استخدام هذا المجمع المخصص على النحو التالي:
Map>> result = pojo.getItems().stream() .collect(Collectors.groupingBy(العنصر::getKey1, Collectors.flatMapping(item -> item.getSubItems().stream(), Collectors.groupingBy(SubItem::getKey2)))));
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3