البرمجة الوظيفية في Java: تقنيات متقدمة وStream API

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة الوظيفية في جافا: المستوى المتقدم



البرمجة الوظيفية (FP) هي نموذج يتم فيه التعامل مع العمليات الحسابية كتقييم للدوال الرياضية، مع تجنب تغيير الحالة والبيانات القابلة للتغيير. جافا، كونها لغة كائنية التوجه، اكتسبت أدوات قوية للبرمجة الوظيفية مع إصدار جافا 8: تعبيرات لامدا، واجهة Stream API، والواجهات الوظيفية. على المستوى المتقدم، تتيح هذه القدرات كتابة كود أكثر إيجازًا وأمانًا وتعبيرًا، خاصة عند العمل مع المجموعات والعمليات غير المتزامنة ومعالجة الأخطاء.



في هذه المقالة، سنستكشف تقنيات البرمجة الوظيفية المتقدمة في جافا: تركيب الدوال، المونادات (Optional و CompletableFuture)، واجهة Stream API مع المعالجة المتوازية، والكَرّي (Currying).



1. تركيب الدوال والواجهات الوظيفية



في جافا، الواجهات الوظيفية هي واجهات بطريقة مجردة واحدة (SAM). الأكثر استخدامًا هي: Function<T, R>، Predicate<T>، Consumer<T>، و Supplier<T>. الاستخدام المتقدم يتضمن تركيب الدوال باستخدام طريقتي andThen() و compose().



مثال: سلسلة تحويل



import java.util.function.Function;

public class FunctionComposition { public static void main(String[] args) { // Function: string -> its length Function<String, Integer> lengthFunction = String::length; // Function: number -> its square Function<Integer, Integer> squareFunction = x -> x * x;

// Composition: string -> length -> square of length Function<String, Integer> composedFunction = lengthFunction.andThen(squareFunction);

String text = "Hello, Java!"; int result = composedFunction.apply(text); // 12 * 12 = 144 System.out.println("Result: " + result); // 144 }}


طريقة andThen() تطبق الدالة الأولى، ثم الثانية. compose() تفعل العكس: تطبق أولاً الدالة المُمررة، ثم الدالة الأولى. هذا يسمح ببناء سلاسل تحويل مرنة وقابلة لإعادة الاستخدام.



مثال عملي: تصفية وتحويل قائمة



import java.util.List;import java.util.function.Function;import java.util.function.Predicate;import java.util.stream.Collectors;

public class PredicateAndFunction { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie", "David", "Eve");

Predicate<String> startsWithA = s -> s.startsWith("A"); Function<String, String> toUpperCase = String::toUpperCase;

List<String> result = names.stream() .filter(startsWithA) .map(toUpperCase) .collect(Collectors.toList());

System.out.println(result); // [ALICE] }}


2. المونادات في جافا: Optional و CompletableFuture



الموناد (Monad) هو نمط يغلف قيمة ويوفر عمليات لتحويلها دون فك التغليف الصريح. في جافا، يتم تنفيذ المونادات من خلال Optional (لمعالجة القيم الخالية) و CompletableFuture (للعمليات غير المتزامنة).



Optional كموناد

الطرق map()، flatMap()، و filter() تسمح بربط العمليات على قيمة قد تكون غائبة.



import java.util.Optional;

public class OptionalMonad { public static void main(String[] args) { // Create an Optional with a non-empty value Optional<String> optional = Optional.of("Hello");

// Transformation chain String result = optional .filter(s -> s.length() > 3) // filter .m

المدونات

توصيات الكتب