0Pricing
Java Academy · درس

IntStream وLongStream

تجنب تحويل الأنواع البدائية إلى كائنات في التدفقات

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

سبب وجود التدفقات البدائية

تضع Stream<Integer> كل عنصر داخل كائن Integer، أي إنها تجري عملية boxing. وتعمل IntStream وLongStream وDoubleStream على القيم البدائية مباشرةً لتجنّب كلفة boxing.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.of(1, 2, 3, 4).sum();
        System.out.println(sum);
    }
}

إنشاء IntStream

استخدموا IntStream.of للقيم المحددة صراحةً، أو Arrays.stream مع مصفوفة int[].

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] data = {10, 20, 30};
        IntStream s = Arrays.stream(data);
        System.out.println(s.max().getAsInt());
    }
}

‏LongStream للأعداد الكبيرة

تحاكي LongStream ‏IntStream، لكنها تعمل مع قيم long، مما يتجنب تجاوز السعة عند جمع أعداد كبيرة.

import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        long total = LongStream.of(1_000_000_000L, 2_000_000_000L).sum();
        System.out.println(total);
    }
}

العمليات النهائية المتخصصة

تضيف التدفقات البدائية دوالًا عددية لا تتوفر في تدفقات الكائنات: sum وmin وmax وaverage.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream nums = IntStream.of(4, 8, 15, 16, 23, 42);
        System.out.println(nums.average().getAsDouble());
    }
}

نتائج OptionalInt

تُرجع min وmax قيمة OptionalInt لأن التدفق قد يكون فارغًا. استخدموا getAsInt أو orElse.

import java.util.OptionalInt;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        OptionalInt result = IntStream.empty().max();
        System.out.println(result.orElse(-1));
    }
}

إبقاء map على النوع البدائي

تستقبل map على IntStream قيمة IntUnaryOperator وتُرجع IntStream آخر، ولذلك لا تحدث عملية boxing.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sumOfSquares = IntStream.of(1, 2, 3)
            .map(n -> n * n)
            .sum();
        System.out.println(sumOfSquares);
    }
}

filter في التدفقات البدائية

تستقبل filter قيمة IntPredicate وتُبقي على القيم البدائية المطابقة.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long evens = IntStream.of(1, 2, 3, 4, 5, 6)
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(evens);
    }
}

‏reduce على IntStream

تطوي reduce التدفق باستخدام IntBinaryOperator. وعند تزويدها بقيمة ابتدائية، تُرجع قيمة int مباشرةً.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int product = IntStream.rangeClosed(1, 5)
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

forEach على القيم البدائية

تستقبل forEach قيمة IntConsumer، مما يتجنب boxing مرة أخرى.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.of(7, 8, 9).forEach(n -> System.out.println(n));
    }
}

التجميع في مصفوفة

تُرجع toArray مصفوفة بدائية من النوع int[]، وهي النظير الطبيعي لـ IntStream.

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] doubled = IntStream.of(1, 2, 3).map(n -> n * 2).toArray();
        System.out.println(Arrays.toString(doubled));
    }
}

التحويل بين Int وLong

توسّع IntStream.asLongStream القيم البدائية إلى long من دون boxing.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long sum = IntStream.of(1, 2, 3).asLongStream().sum();
        System.out.println(sum);
    }
}

تحقّق سريع

ما السبب الرئيسي لاستخدام IntStream بدلًا من Stream<Integer>؟

مراجعة

استخدمتم التدفقات البدائية لتجنب boxing:

  • تحتوي IntStream وLongStream على قيم بدائية مباشرة.
  • تضيفان عمليات نهائية عددية: sum وmin وmax وaverage.
  • تُرجع min وmax قيمة OptionalInt.
  • تظل map وfilter وreduce وtoArray جميعًا على النوع البدائي.

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

هل درس «IntStream وLongStream» مجاني؟

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

ماذا ستتعلم في «IntStream وLongStream»؟

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

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

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

كم من الوقت يستغرق درس «IntStream وLongStream»؟

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

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

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

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

  1. IntStream وLongStream
  2. عمليات النطاق والتجميع
  3. التحويل من تدفقات الكائنات وإليها
  4. توليد التدفقات البدائية
← العودة إلى Java Academy