تحديثات ذرّية للخرائط باستخدام 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
الصعوبة
متوسط
دعم JDK
تحديثات ذرّية للخرائط باستخدام compute و merge
متاح
متاح على نطاق واسع منذ JDK 8 (مارس 2014)
كيف يعمل
تجمع دوال الحساب في Map قصد البحث والتحديث في عملية واحدة. استخدم computeIfAbsent() للتهيئة الكسولة، و compute() عندما تعتمد القيمة الجديدة على القيمة الموجودة، و merge() لدمج قيمة مقدّمة مع قيمة موجودة في الخريطة. وفي تطبيقات الخرائط المتزامنة، تتجنب العمليات الحسابية المدعومة أيضاً حالات التسابق الناتجة عن استدعاءات get() و put() المنفصلة.
توثيق ذو صلة
إثبات