مقدمة: لماذا دمج القوائم في Java وكيف لا ترتبك
تخيل: لديك قائمتان من المهام - "العاجلة" و"المهمة". أو قائمتان من العملاء - من قاعدة البيانات الشهر الماضي والشهر الحالي. للعمل معهم ككيان واحد، تحتاج إلى دمجهما. في Java، هذه المهمة شائعة جدًا لدرجة أن سؤال «How do I join two lists in Java?» على Stack Overflow يجمع آلاف المشاهدات. وهذا ليس من قبيل الصدفة: غالبًا ما يسبب دمج القوائم ارتباكًا للمبتدئين - إما خطأ في الترجمة، أو أن القائمة غير قابلة للتغيير، أو فقدان البيانات.
في هذه المقالة، سنستعرض 5 طرق مثبتة لدمج قائمتين في Java - من الطريقة الكلاسيكية addAll إلى الطريقة الأنيقة Stream API. ستتعرف على الطريقة المناسبة لمواقف مختلفة، وكيفية تجنب المخاطر وكتابة كود يعمل بسرعة ويمكن التنبؤ به. هيا بنا!
الطريقة 1: addAll الكلاسيكية - بسيطة وموثوقة
الطريقة الأكثر مباشرة هي استخدام طريقة addAll() من واجهة Collection. تضيف جميع عناصر مجموعة إلى أخرى. يبدو الأمر مثاليًا، ولكن هناك فارق بسيط: إنها تغير القائمة الأصلية. إذا كنت بحاجة إلى الحفاظ على القوائم الأصلية دون تغيير - فأنشئ قائمة جديدة.
مثال: الدمج مع الحفاظ على النسخ الأصلية
import java.util.ArrayList;import java.util.List;
public class JoinListsExample { public static void main(String[] args) { List<String> listA = new ArrayList<>(List.of("Java", "Python", "C++")); List<String> listB = new ArrayList<>(List.of("JavaScript", "Go", "Rust"));
// إنشاء قائمة جديدة وإضافة كلتا القائمتين إليها List<String> mergedList = new ArrayList<>(listA); mergedList.addAll(listB);
System.out.println(mergedList); // [Java, Python, C++, JavaScript, Go, Rust] // القوائم الأصلية لم تتغير }}الإيجابيات: بديهية، تعمل مع أي نوع من List، لا تتطلب Java 8+.
السلبيات: تغير القائمة الأصلية إذا لم يتم إنشاء قائمة جديدة؛ لا تدعم الحسابات البطيئة.
الطريقة 2: Stream API - حديث ومرن
إذا كنت تستخدم Java 8 أو أحدث، فإن Stream API يقدم طريقة أنيقة لدمج القوائم. لا يغير البيانات الأصلية ويمكن دمجه بسهولة مع عمليات أخرى - التصفية والترتيب والتحويل.
الدمج الأساسي باستخدام Stream.concat
import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;
public class StreamJoinExample { public static void main(String[] args) { List<String> listA = List.of("أحمر", "أخضر", "أزرق"); List<String> listB = List.of("أصفر", "بنفسجي");
List<String> mergedList = Stream.concat(listA.stream(), listB.stream()) .collect(Collectors.toList());
System.out.println(mergedList); // [أحمر, أخضر, أزرق, أصفر, بنفسجي] }}الدمج مع التصفية والترتيب
لنفترض أنك بحاجة إلى دمج قائمتين من الأرقام، والاحتفاظ بالأرقام الزوجية فقط وترتيبها تنازليًا:
import java.util.List;import java.util.Comparator;import java.util.stream.Collectors;import java.util.stream.Stream;
public class StreamAdvancedJoin { public static void main(String[] args) { List<Integer> listA = List.of(5, 2, 8, 1); List<Integer> listB = List.of(7, 4, 9, 3);
List<Integer> result = Stream.concat(listA.stream(), listB.stream()) .filter(n -> n % 2 == 0) // فقط الأرقام الزوجية .sorted(Comparator.reverseOrder()) .collect(C