0Pricing
Java Academy · درس

التدفقات اللانهائية باستخدام iterate وgenerate

أنشئ تدفقات لانهائية باستخدام Stream.iterate وStream.generate، ثم أوقفها باستخدام limit أو take-while

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

ما هي التدفقات اللانهائية؟

يمكن أن تكون تدفقات Java لانهائية، إذ تنتج العناصر عند الطلب من دون نهاية. ويجب إنهاؤها بعملية تحد من النتائج (limit أو takeWhile أو findFirst وغيرها) لتجنب استمرارها إلى ما لا نهاية.

Stream.iterate: متتاليات ببذرة

ينشئ Stream.iterate(seed, f) تدفقًا لانهائيًا من خلال تطبيق f بشكل متكرر على القيمة السابقة. ويكون العنصر الأول هو البذرة.

// Infinite even numbers: 0, 2, 4, 6, 8, ...
Stream.iterate(0, n -> n + 2)
    .limit(10)
    .forEach(System.out::println);

iterate مع Predicate (Java 9+)

يضيف Stream.iterate(seed, predicate, f) شرطًا للتوقف، مثل حلقة for لها شرط. يتوقف التدفق عندما تكون قيمة predicate هي false.

// Equivalent to: for (int i = 1; i <= 100; i *= 2)
Stream.iterate(1, n -> n <= 100, n -> n * 2)
    .forEach(System.out::println); // 1 2 4 8 16 32 64

Stream.generate: مولّد عديم الحالة

يستدعي Stream.generate(Supplier) المورّد لكل عنصر. ويمكن أن يكون المورّد عديم الحالة (مثل الأرقام العشوائية) أو معتمدًا على الحالة (مثل استخدام عدّاد خارجي).

// Infinite random doubles between 0.0 and 1.0:
Stream.generate(Math::random)
    .limit(5)
    .forEach(System.out::println);

إنشاء UUIDs

استخدموا generate مع UUID::randomUUID لإنشاء تدفق من المعرّفات الفريدة لاستخدامه في إنشاء معرّفات الدفعات.

List<String> ids = Stream.generate(() -> UUID.randomUUID().toString())
    .limit(100)
    .collect(Collectors.toList());
System.out.println(ids.size()); // 100

Fibonacci باستخدام iterate

أنشئوا أعداد Fibonacci باستخدام حالة مكوّنة من زوج. يجعل iterate ذو الوسيطين في Java 9 هذا الأمر أنيقًا.

Stream.iterate(new long[]{0, 1}, p -> new long[]{p[1], p[0]+p[1]})
    .limit(10)
    .map(p -> p[0])
    .forEach(System.out::println); // 0 1 1 2 3 5 8 13 21 34

takeWhile وdropWhile (Java 9+)

تأخذ takeWhile(predicate) العناصر ما دام الشرط متحققًا، ثم تتوقف. وتتخطى dropWhile العناصر إلى أن يفشل الشرط، ثم تأخذ العناصر المتبقية.

// takeWhile stops at the first element where predicate is false:
Stream.iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println); // 1 2 3 4 5 6 7 8 9

التدفقات اللانهائية لاستطلاع إعادة المحاولة

مثّلوا حلقة استطلاع باستخدام generate: أنشئوا نتائج الفحص، ثم استخدموا takeWhile ما دام الشرط غير متحقق، وبعد ذلك خذوا أول نتيجة ناجحة.

Optional<String> result = Stream.generate(() -> checkJobStatus(jobId))
    .takeWhile(status -> status.equals("PENDING"))
    .findFirst();
// When job completes, takeWhile stops and findFirst gets "DONE"

IntStream.range وrangeClosed

بالنسبة إلى المتتاليات الصحيحة المحدودة، يكون IntStream.range(start, end) وrangeClosed(start, end) أكثر كفاءة من iterate.

// Sum 1 to 1000:
int sum = IntStream.rangeClosed(1, 1000).sum();
System.out.println(sum); // 500500

LongStream.iterate للمتتاليات الطويلة

استخدموا LongStream.iterate للمتتاليات الطويلة لتجنب التكلفة الإضافية للتغليف التلقائي في Stream<Long>.

long sumOfPrimes = LongStream.iterate(2, n -> n + 1)
    .filter(n -> isPrime(n))
    .limit(1000)
    .sum();

التدفقات اللانهائية كسولة

لا تحسب التدفقات اللانهائية العناصر مسبقًا. يُنشأ كل عنصر فقط عندما تطلبه العملية النهائية. وتجعل هذه الكسولة التدفقات اللانهائية عملية.

تحقق سريع

ما آلية التوقف المطلوبة عند التعامل مع تدفق لانهائي؟

مراجعة

استخدموا iterate(seed, f) للمتتاليات، وgenerate(supplier) لإنشاء عناصر مستقلة. أضيفوا دائمًا عملية نهائية قصيرة الدائرة (limit أو takeWhile أو findFirst). التدفقات اللانهائية كسولة — ولا تُنشأ عناصرها إلا عند الطلب.

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

هل درس «التدفقات اللانهائية باستخدام iterate وgenerate» مجاني؟

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

ماذا ستتعلم في «التدفقات اللانهائية باستخدام iterate وgenerate»؟

أنشئ تدفقات لانهائية باستخدام Stream.iterate وStream.generate، ثم أوقفها باستخدام limit أو take-while تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «التدفقات اللانهائية باستخدام iterate وgenerate»؟

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

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

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

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

  1. ‏flatMap للمجموعات المتداخلة
  2. التدفقات المتوازية: الأداء والمشكلات
  3. ‏Spliterator: التقسيم لتحقيق التوازي
  4. التدفقات اللانهائية باستخدام iterate وgenerate
← العودة إلى Java Academy