البرمجة الوظيفية في Kotlin: الأساسيات والأمثلة

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

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

ابدأ الدورة

مقدمة في البرمجة الوظيفية بلغة Kotlin



Kotlin هي لغة حديثة متعددة النماذج تجمع بسلاسة بين البرمجة الكائنية والوظيفية. بفضل بناء جملها المختصر وقدراتها القوية، تسمح لك Kotlin بكتابة كود نظيف ويمكن التنبؤ به وسهل الاختبار. البرمجة الوظيفية في Kotlin ليست مجرد موضة عابرة، بل هي أداة قوية لحل المهام اليومية: من معالجة المجموعات إلى بناء سلاسل الاستدعاء غير المتزامنة.



في هذه المقالة، سنقوم بتحليل المفاهيم الأساسية للبرمجة الوظيفية كما تطبق على Kotlin: ثبات البيانات، الدوال كقيم من الدرجة الأولى، تعبيرات اللامدا، الدوال عالية المستوى، وسلاسل معالجة المجموعات (map, filter, reduce). جميع الأمثلة ستكون مصحوبة بكود عملي يمكنك تشغيله فوراً في IntelliJ IDEA أو مترجم عبر الإنترنت.



أسس المنهج الوظيفي في Kotlin



الثبات



المبدأ الأساسي للبرمجة الوظيفية هو العمل مع بيانات غير قابلة للتغيير. في Kotlin، تُستخدم الكلمات المفتاحية val (مرجع غير قابل للتغيير) والمجموعات غير القابلة للتغيير (listOf, mapOf, setOf) لهذا الغرض.



// Immutable listval numbers: List<Int> = listOf(1, 2, 3, 4, 5)

// Attempting to modify will cause a compilation error// numbers.add(6) // Error!

// Instead of mutation, create a new collectionval newNumbers = numbers + 6 // [1, 2, 3, 4, 5, 6]


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



الدوال كقيم من الدرجة الأولى



في Kotlin، الدوال هي كائنات كاملة الصلاحية. يمكن تعيينها للمتغيرات، وتمريرها إلى دوال أخرى، وإرجاعها من الدوال. يُكتب نوع الدالة بين قوسين مع سهم:



// Function as a valueval sum: (Int, Int) -> Int = { a, b -> a + b }

// Usageval result = sum(10, 20) // 30

// Function that takes another functionfun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b)}

println(operate(5, 3, sum)) // 8println(operate(5, 3, { x, y -> x * y })) // 15


ملاحظة: إذا كانت اللامدا هي آخر وسيط، تسمح لك Kotlin بنقلها خارج الأقواس - وهذا هو بناء جمل اللامدا الخلفي، مما يجعل الكود مقروءاً جداً.



تعبيرات اللامدا والدوال عالية المستوى



تعبيرات اللامدا



اللامدا هي دالة مجهولة محصورة بين قوسين متعرجين. في Kotlin، يمكن للامدا التقاط متغيرات من السياق الخارجي (الإغلاقات).



// Simple lambdaval greet = { name: String -> "Hello, $name!" }println(greet("Anna")) // Hello, Anna!

// Lambda with multiple parametersval multiply: (Int, Int) -> Int = { a, b -> a * b }

// If there is one parameter, you can use itval double = { it: Int -> it * 2 }println(double(5)) // 10


الدوال عالية المستوى



هذه هي الدوال التي تأخذ دوالاً أخرى كوسائط أو تُرجعها. تحتوي مكتبة Kotlin القياسية على العديد من هذه الدوال: let, apply, run, with, وغيرها. دعونا نلقي نظرة على مثال عملي:



data class User(val name: String, val age: Int)

fun processUsers(users: List<User>, filter: (User) -> Boolean, transform: (User) -> String): List<String> { return users.filter(filter).map(transform)}

val users = listOf( User("Ivan", 25), User("Maria", 17), User("Peter", 30))

// Filter adults and output their namesval adultNames = processUsers( users, filter = { it.age >= 18 }, transform = { "Adult: ${it.name}" })

المدونات

توصيات الكتب