"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تنفيذ التجميع متعدد المستويات مع الكائنات المتداخلة في Java 8؟

كيفية تنفيذ التجميع متعدد المستويات مع الكائنات المتداخلة في Java 8؟

تم النشر بتاريخ 2024-11-07
تصفح:263

How to Implement Multi-Level Grouping with Nested Objects in Java 8?

التجميع متعدد المستويات في 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)))));
بيان الافراج أعيد طبع هذه المقالة على: 1729730703 في حالة وجود أي انتهاك، يرجى الاتصال بـ [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3