التحويل من تدفقات الكائنات وإليها
mapToObj وmapToInt
التحويل من تدفقات الكائنات وإليها درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
عالما التدفقات
تحتوي Java على تدفقات الكائنات (Stream<T>) والتدفقات البدائية (IntStream وما شابهها). وتتيح دوال التحويل الانتقال بينهما.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
System.out.println(IntStream.rangeClosed(1, 3).sum());
}
}mapToObj: من البدائي إلى الكائن
تحوّل mapToObj كل قيمة بدائية إلى كائن، وتنتج Stream<T>.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<String> labels = IntStream.rangeClosed(1, 3)
.mapToObj(n -> "item-" + n)
.collect(Collectors.toList());
System.out.println(labels);
}
}mapToInt: من الكائن إلى البدائي
تستخرج mapToInt قيمة int من كل كائن، وتنتج IntStream جاهزًا للتجميع العددي.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("hi", "hello", "hey");
int totalChars = words.stream()
.mapToInt(String::length)
.sum();
System.out.println(totalChars);
}
}boxed: من البدائي إلى تدفق الأغلفة
تحوّل boxed قيمة IntStream إلى Stream<Integer>، وهو ما تحتاجونه قبل التجميع في List.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<Integer> list = IntStream.rangeClosed(1, 5)
.boxed()
.collect(Collectors.toList());
System.out.println(list);
}
}mapToLong وmapToDouble
ينطبق النمط نفسه على الأنواع البدائية الأخرى: mapToLong وmapToDouble.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> prices = List.of("9.99", "19.50", "4.25");
double total = prices.stream()
.mapToDouble(Double::parseDouble)
.sum();
System.out.println(total);
}
}لماذا يتفوق mapToInt على map
يُبقي استخدام map على تدفق كائنات القيمَ داخل أغلفتها. أما mapToInt فيتيح دوالًا عددية مثل sum وaverage مع تجنب boxing.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(10, 20, 30);
double avg = nums.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
System.out.println(avg);
}
}رحلة ذهاب وإياب: من الكائن إلى Int ثم إلى الكائن
يمكنكم الانتقال في الاتجاهين ضمن مسار واحد: استخراج الأعداد، ثم تحويلها، ثم إعادتها إلى كائنات.
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("a", "bb", "ccc");
List<String> report = words.stream()
.mapToInt(String::length)
.mapToObj(len -> "len=" + len)
.collect(Collectors.toList());
System.out.println(report);
}
}asLongStream وasDoubleStream
يمكنكم توسيع الأنواع داخل التدفقات البدائية: إذ يتجنب asLongStream وasDoubleStream boxing أثناء تغيير العرض العددي.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
double avg = IntStream.of(1, 2, 3, 4)
.asDoubleStream()
.average()
.getAsDouble();
System.out.println(avg);
}
}تجميع النتائج البدائية
لجمع القيم البدائية في مجموعة، استدعوا boxed أولًا، ثم جامعًا.
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Set<Integer> evens = IntStream.rangeClosed(1, 10)
.filter(n -> n % 2 == 0)
.boxed()
.collect(Collectors.toSet());
System.out.println(evens);
}
}flatMapToInt
تُسطّح flatMapToInt الكائنات في IntStream واحد، وهي مفيدة عندما ينتج كل كائن عدة أعداد.
import java.util.List;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
int sum = rows.stream()
.flatMapToInt(Arrays::stream)
.sum();
System.out.println(sum);
}
}اختيار المحوّل المناسب
اختاروا المحوّل وفقًا لاتجاه التحويل:
- من كائن إلى قيمة بدائية:
mapToIntأوmapToLongأوmapToDouble. - من قيمة بدائية إلى كائن:
mapToObjأوboxed.
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> in = List.of("x", "yy");
String out = in.stream()
.mapToInt(String::length)
.mapToObj(Integer::toString)
.collect(Collectors.joining(","));
System.out.println(out);
}
}تحقّق سريع
ما الدالة التي تحوّل IntStream إلى Stream<Integer>؟
مراجعة
انتقلتم بين تدفقات الكائنات والتدفقات البدائية:
- تحوّل
mapToInt/mapToLong/mapToDoubleالتدفق من كائنات إلى قيم بدائية. - تحوّل
mapToObjوboxedالتدفق من قيم بدائية إلى كائنات. - تُسطّح
flatMapToIntعدة أعداد في IntStream واحد. - يتيح الانتقال إلى التدفقات البدائية التجميعات العددية من دون boxing.
الأسئلة الشائعة
هل درس «التحويل من تدفقات الكائنات وإليها» مجاني؟
نعم — نص درس «التحويل من تدفقات الكائنات وإليها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحويل من تدفقات الكائنات وإليها»؟
mapToObj وmapToInt تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التحويل من تدفقات الكائنات وإليها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- IntStream وLongStream
- عمليات النطاق والتجميع
- التحويل من تدفقات الكائنات وإليها
- توليد التدفقات البدائية