0Pricing
Java Academy · درس

الأخطاء الشائعة

تجنّب الأخطاء المتكررة في Streams: إعادة استخدام التدفقات، والآثار الجانبية الخفية، واستخدام التوازي مع حالة قابلة للتغيير.

الأخطاء الشائعة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 3 دروس في المجموع.

مقدمة

تتميز التدفقات بالقوة، لكن لها مزالق، منها إعادة استخدام Stream، والآثار الجانبية الخفية، وخلط التوازي بالحالة القابلة للتغيير.

تدفقات للاستخدام مرة واحدة

إن Stream مخصص للاستخدام مرة واحدة: فبعد إجراء نهائي مثل forEach أو collect أو reduce، لا يمكن استخدامه مجددًا.

الشفرة: خطأ إعادة الاستخدام

بعد إجراء نهائي، يكون Stream قد استُهلك؛ وتؤدي محاولة إعادة استخدامه إلى إطلاق IllegalStateException.

import java.util.*;import java.util.stream.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1, 2, 3);
    Stream<Integer> s = nums.stream();
    s.forEach(System.out::println); // terminal
    try {
      s.forEach(System.out::println); // reuse -> IllegalStateException
    } catch (IllegalStateException e) {
      System.out.println("Oops: " + e.getMessage());
    }
  }
}

الآثار الجانبية

تجنبوا الآثار الجانبية داخل map/filter، مثل تعديل القوائم الخارجية. وفضلوا الدوال النقية واستخدام collect() في النهاية.

الشفرة: الآثار الجانبية مقابل collect

يُعد تعديل الحالة داخل خط المعالجة هشًا. أما إصدار collect() فهو أوضح وأكثر أمانًا.

import java.util.*;import java.util.stream.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1,2,3);
    // Pitfall: mutating external list from map/forEach
    List<Integer> out = new ArrayList<>();
    nums.stream().map(n -> { out.add(n*n); return n*n; }).forEach(x -> {});
    System.out.println("With side effects: " + out);

    // Better: use collect to build the result
    List<Integer> squares = nums.stream().map(n -> n*n).collect(Collectors.toList());
    System.out.println("With collect: " + squares);
  }
}

الشفرة: التوازي + الحالة القابلة للتغيير

قد تتسبب التدفقات المتوازية والحاويات القابلة للتغيير في حالات تسابق. وفضلوا استخدام collect() لأنه يتعامل مع التزامن.

import java.util.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = java.util.Arrays.asList(1,2,3,4,5);
    // Pitfall: adding to a normal ArrayList from parallel pipeline (unsafe)
    List<Integer> unsafe = new ArrayList<>();
    nums.parallelStream().forEach(n -> unsafe.add(n)); // may be unsafe
    System.out.println("Parallel add to ArrayList (unsafe demo): " + unsafe);

    // Safer: use built-in collectors
    List<Integer> safe = nums.parallelStream().map(n -> n).collect(java.util.stream.Collectors.toList());
    System.out.println("Collected safely: " + safe);
  }
}

تحقق من المزالق

تحقق سريع: ما أحد المزالق الشائعة في Stream للمبتدئين؟

مراجعة

مراجعة: 1) التدفقات مخصصة للاستخدام مرة واحدة. 2) تجنبوا الآثار الجانبية في خطوط المعالجة. 3) لا تخلطوا التدفقات المتوازية بالحالة القابلة للتغيير غير الآمنة.

الأسئلة الشائعة

هل درس «الأخطاء الشائعة» مجاني؟

نعم — نص درس «الأخطاء الشائعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 3 دروس في المجموع.

ماذا ستتعلم في «الأخطاء الشائعة»؟

تجنّب الأخطاء المتكررة في Streams: إعادة استخدام التدفقات، والآثار الجانبية الخفية، واستخدام التوازي مع حالة قابلة للتغيير. تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «الأخطاء الشائعة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الترتيب والتنفيذ بالتقييم القصير
  2. أساسيات Streams المتوازية
  3. الأخطاء الشائعة
← العودة إلى Java Academy