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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- IntStream وLongStream
- عمليات النطاق والتجميع
- التحويل من تدفقات الكائنات وإليها
- توليد التدفقات البدائية