Function وBiFunction
تحويل القيم بأسلوب وظيفي
Function وBiFunction درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما الذي تمثّله Function
تمثل Function<T, R> واجهة التحويل الأساسية في java.util.function. فهي تأخذ وسيطًا واحدًا من النوع T وتعيد نتيجة من النوع R.
- طريقتها المجردة الوحيدة هي
R apply(T t). - وهي تمثل تحويلًا نقيًا من المدخل إلى المخرج.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> length = s -> s.length();
System.out.println(length.apply("hello"));
}
}استدعاء apply
تستدعون Function باستدعاء apply. ويحتوي جسم lambda على منطق التحويل.
- يمكن أن يختلف نوعا المدخل والمخرج.
- يمكن لمرجع طريقة مثل
String::toUpperCaseأن يحل محل lambda.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> upper = String::toUpperCase;
System.out.println(upper.apply("java"));
}
}تركيب andThen
تسلسل andThen الدوال، إذ تصبح نتيجة الدالة الأولى مدخلًا للدالة الثانية.
- يعني
f.andThen(g)g(f(x)). - وتُقرأ العملية من اليسار إلى اليمين.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> times2 = n -> n * 2;
Function<Integer, Integer> plus3 = n -> n + 3;
System.out.println(times2.andThen(plus3).apply(5));
}
}تركيب compose
تنفّذ compose دالة الوسيط أولًا.
- يعني
f.compose(g)f(g(x)). - وهي الصورة المعكوسة من
andThen.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> times2 = n -> n * 2;
Function<Integer, Integer> plus3 = n -> n + 3;
System.out.println(times2.compose(plus3).apply(5));
}
}Function.identity
تعيد Function.identity() دالة تعيد مدخلها من دون تغيير.
- وهي مفيدة في مجمّعات التدفقات والتعيينات الافتراضية.
- وتكافئ
x -> x.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> id = Function.identity();
System.out.println(id.apply("unchanged"));
}
}التعرّف على BiFunction
تأخذ BiFunction<T, U, R> وسيطين وتعيد نتيجة واحدة.
- طريقتها هي
R apply(T t, U u). - وهي مناسبة لدمج قيمتين، مثل دمج الخرائط.
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(4, 6));
}
}BiFunction مع أنواع مختلفة
يمكن أن تختلف معاملات الأنواع الثلاثة في BiFunction جميعًا.
- نجمع هنا بين
StringوintلإنتاجString.
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<String, Integer, String> repeat = (s, n) -> s.repeat(n);
System.out.println(repeat.apply("ab", 3));
}
}andThen مع BiFunction
تدعم BiFunction أيضًا andThen، إذ تأخذ Function ذات وسيط واحد لمعالجة النتيجة لاحقًا.
- لا توجد
composeفيBiFunctionلأنها ستحتاج إلى مدخلين.
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
Function<Integer, String> label = n -> "sum=" + n;
System.out.println(add.andThen(label).apply(7, 8));
}
}الدوال في المجموعات
تقبل العديد من واجهات API كائنًا من نوع Function. فعلى سبيل المثال، تأخذ Map.computeIfAbsent دالة تعيين للمفاتيح المفقودة.
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> lengths = new HashMap<>();
lengths.computeIfAbsent("hello", String::length);
System.out.println(lengths);
}
}تخزين الدوال في المتغيرات
بما أن الدوال كائنات، يمكنكم تخزينها وتمريرها وإعادتها. وهذا هو الأساس الذي تقوم عليه Java بأسلوب وظيفي.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> square = n -> n * n;
Function<Integer, Integer> cube = n -> n * n * n;
Function<Integer, Integer> chosen = square;
System.out.println(chosen.apply(5));
}
}بناء مسار معالجة
يؤدي تسلسل andThen بشكل متكرر إلى بناء مسار تحويل واضح وقابل لإعادة الاستخدام.
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> trim = String::trim;
Function<String, String> upper = String::toUpperCase;
Function<String, Integer> len = String::length;
System.out.println(trim.andThen(upper).andThen(len).apply(" abc "));
}
}اختبار سريع
ما الذي يحسبه f.andThen(g).apply(x)؟
مراجعة
لقد تعلمتم واجهات التحويل الأساسية:
- تحوّل
Function<T,R>قيمة واحدة باستخدامapply. - يسلسل
andThenالتحويلات إلى الأمام (g(f(x)))، بينما يسلسلcomposeالتحويلات إلى الخلف (f(g(x))). - تعيد
Function.identity()المدخل. - تعالج
BiFunction<T,U,R>مدخلين، وتدعمandThenولا تدعمcompose.
الأسئلة الشائعة
هل درس «Function وBiFunction» مجاني؟
نعم — نص درس «Function وBiFunction» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «Function وBiFunction»؟
تحويل القيم بأسلوب وظيفي تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «Function وBiFunction»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Function وBiFunction
- Supplier وConsumer
- Predicate والتركيب
- الواجهات الوظيفية المخصصة