ستريم إلى مصفوفة: كيف توقفت عن الخوف وأحببت toArray() في Java 8

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

السؤال الأبدي: كيف نحول الستريم إلى مصفوفة؟

\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

المحتويات (للتنقل)

\n\n\n

لماذا نحول Stream إلى Array أصلاً؟

\n

قبل الغوص في الكود، دعنا نفهم الدافع. Stream API هي أداة قوية لمعالجة البيانات: التصفية، التحويل، الفرز. لكن هناك سيناريوهات تكون فيها المصفوفة أكثر ملاءمة:

\n
    \n
  • التوافق مع الكود القديم: الطرق القديمة غالباً ما تقبل فقط String[] أو int[].
  • \n
  • الأداء: في بعض الحالات، تعمل المصفوفة أسرع من القائمة، خاصة إذا كان الحجم ثابتاً.
  • \n
  • العمل مع Varargs: طرق مثل void doSomething(String... args) تتوقع مصفوفة.
  • \n
  • تسلسل JSON: العديد من المكتبات (مثل Jackson) تعمل بشكل أفضل مع المصفوفات.
  • \n
\n

لذا فإن القدرة على تحويل الستريم بسرعة إلى مصفوفة هي مهارة أساسية لأي مطور Java. انطلق!

\n\n

الطريقة 1: toArray() — الأسهل (لكن مع مفاجأة)

\n

لنبدأ بالكلاسيكيات. كل Stream لديه طريقة toArray() تُرجع Object[]. تبدو هكذا:

\n\n
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[]، فسيتعين عليك إجراء تحويل نوع:

\n\n
String[] stringArray = (String[]) stream.toArray(); // ClassCastException!\n
\n\n

خطأ! لا تستطيع Java تحويل Object[] إلى String[] — فهما نوعان مختلفان. لذلك، toArray() بدون معاملات يصلح فقط عندما تكون مستعداً للعمل مع Object[]. لكن هذا نادر. ماذا تفعل؟ تابع القراءة.

\n\n

الطريقة 2: toArray(IntFunction) — الأدوية الجنيسة تأتي للنجدة

\n

أهدتنا Java 8 نسخة محملة بشكل زائد من toArray(IntFunction<A[]> generator). هذه الطريقة تقبل دالة تنشئ مصفوفة من النوع المطلوب. IntFunction هي واجهة وظيفية تقبل int (حجم المصفوفة) وتُعيد مصفوفة.

\n\n

المثال الأكثر وضوحاً هو استخدام مُنشئ المصفوفة عبر لامدا:

\n\n
Stream<String> stream = Stream.of("Java", "Python", "Ruby");\nString[] array = stream.toArray(size -> new Str                

المدونات

توصيات الكتب