السؤال الأبدي: كيف نحول الستريم إلى مصفوفة؟
\n\nمرحباً، زميلي! إذا سبق لك أن كتبت كوداً بلغة Java 8 أو أحدث، فبالتأكيد واجهت هذا الموقف: لديك Stream — رائع، حديث، وظيفي — ولكن فجأة احتجت إلى مصفوفة قديمة جيدة. ربما تتطلب مكتبة API مصفوفة، أو تريد تمرير البيانات إلى دالة لا تتعامل مع المجموعات. وهنا يحدث التوقف: "How can I convert a Java 8 Stream to an Array?" — نعم، نعم، نفس السؤال الذي جمع آلاف المشاهدات على Stack Overflow.
\n\nقد يبدو الأمر بسيطاً؟ لكن هناك تفاصيل دقيقة. في هذه المقالة، سنشرح جميع الطرق: من toArray() البسيط إلى الاستخدام المتقدم لمراجع المُنشئ. ستعرف لماذا يُرجع stream.toArray() Object[] وليس String[]، وكيفية إصلاح ذلك. هيا بنا!
المحتويات (للتنقل)
\n- \n
- لماذا نحول Stream إلى Array أصلاً؟ \n
- الطريقة 1: toArray() — الأسهل (لكن مع مفاجأة) \n
- الطريقة 2: toArray(IntFunction) — الأدوية الجنيسة تأتي للنجدة \n
- الطريقة 3: toArray(String[]::new) — السكر النحوي \n
- الطريقة 4: IntStream والمصفوفات البدائية \n
- الأخطاء النموذجية وكيفية تجنبها \n
- الخلاصة: ورقة غش للنسخ السريع \n
لماذا نحول Stream إلى Array أصلاً؟
\nقبل الغوص في الكود، دعنا نفهم الدافع. Stream API هي أداة قوية لمعالجة البيانات: التصفية، التحويل، الفرز. لكن هناك سيناريوهات تكون فيها المصفوفة أكثر ملاءمة:
\n- \n
- التوافق مع الكود القديم: الطرق القديمة غالباً ما تقبل فقط
String[]أوint[]. \n - الأداء: في بعض الحالات، تعمل المصفوفة أسرع من القائمة، خاصة إذا كان الحجم ثابتاً. \n
- العمل مع Varargs: طرق مثل
void doSomething(String... args)تتوقع مصفوفة. \n - تسلسل JSON: العديد من المكتبات (مثل Jackson) تعمل بشكل أفضل مع المصفوفات. \n
لذا فإن القدرة على تحويل الستريم بسرعة إلى مصفوفة هي مهارة أساسية لأي مطور Java. انطلق!
\n\nالطريقة 1: toArray() — الأسهل (لكن مع مفاجأة)
\nلنبدأ بالكلاسيكيات. كل Stream لديه طريقة toArray() تُرجع Object[]. تبدو هكذا:
Stream<String> stream = Stream.of("Java", "Python", "Ruby");\nObject[] array = stream.toArray();\n\n// الإخراج: [Java, Python, Ruby]\nSystem.out.println(Arrays.toString(array));\n\n\nكل شيء يعمل — لكن هناك تفصيل. نوع المصفوفة الناتجة هو Object[]، وليس String[]. إذا كنت تحتاج تحديداً إلى String[]، فسيتعين عليك إجراء تحويل نوع:
String[] stringArray = (String[]) stream.toArray(); // ClassCastException!\n\n\nخطأ! لا تستطيع Java تحويل Object[] إلى String[] — فهما نوعان مختلفان. لذلك، toArray() بدون معاملات يصلح فقط عندما تكون مستعداً للعمل مع Object[]. لكن هذا نادر. ماذا تفعل؟ تابع القراءة.
الطريقة 2: toArray(IntFunction) — الأدوية الجنيسة تأتي للنجدة
\nأهدتنا Java 8 نسخة محملة بشكل زائد من toArray(IntFunction<A[]> generator). هذه الطريقة تقبل دالة تنشئ مصفوفة من النوع المطلوب. IntFunction هي واجهة وظيفية تقبل int (حجم المصفوفة) وتُعيد مصفوفة.
المثال الأكثر وضوحاً هو استخدام مُنشئ المصفوفة عبر لامدا:
\n\nStream<String> stream = Stream.of("Java", "Python", "Ruby");\nString[] array = stream.toArray(size -> new Str