Collections متوسط

تحديثات ذرّية للخرائط باستخدام compute و merge

استبدل البحث متعدد الخطوات في الخريطة وتعديلها بـ computeIfAbsent() و compute() و merge().

✕ Manual lookup and update
List<String> values = groups.get(key);
if (values == null) {
    values = new ArrayList<>();
    groups.put(key, values);
}
values.add(value);
✓ Java 8+
groups.computeIfAbsent(key, ignored -> new ArrayList<>())
        .add(value);
هل ترى مشكلة في هذا الكود؟ أخبرنا.
⚡

عمليات بحث أقل

يتجنب الوصول المتكرر إلى المفتاح.

🧵

دلالات تزامن أفضل

يمكن للخرائط المتزامنة تنفيذ التحديثات المدعومة بصورة ذرّية.

👁

قصد واضح

تظهر قاعدة التهيئة بجوار عملية الوصول.

الأسلوب القديم
get() + فحص null + put()
الأسلوب الحديث
computeIfAbsent()
منذ JDK
8
الصعوبة
متوسط
تحديثات ذرّية للخرائط باستخدام compute و merge
متاح

متاح على نطاق واسع منذ JDK 8 (مارس 2014)

تجمع دوال الحساب في Map قصد البحث والتحديث في عملية واحدة. استخدم computeIfAbsent() للتهيئة الكسولة، و compute() عندما تعتمد القيمة الجديدة على القيمة الموجودة، و merge() لدمج قيمة مقدّمة مع قيمة موجودة في الخريطة. وفي تطبيقات الخرائط المتزامنة، تتجنب العمليات الحسابية المدعومة أيضاً حالات التسابق الناتجة عن استدعاءات get() و put() المنفصلة.