مقدمة في البرمجة الوظيفية باستخدام Kotlin
Kotlin هي لغة حديثة متعددة النماذج تجمع بسلاسة بين البرمجة كائنية التوجه والبرمجة الوظيفية. يسمح لك الأسلوب الوظيفي بكتابة كود أكثر قابلية للتنبؤ وإيجازًا وقابلية للاختبار. في هذه المقالة، سنقوم بتحليل المفاهيم الأساسية للبرمجة الوظيفية في Kotlin: الدوال البحتة، ثبات البيانات، الدوال عالية الترتيب، والعمل مع المجموعات من خلال map و filter و fold. المواد موجهة للمطورين الملمين بالفعل بأساسيات بناء جملة Kotlin.
الدوال البحتة والثبات
ما هي الدالة البحتة؟
الدالة البحتة هي دالة:
- ترجع دائمًا نفس النتيجة لنفس الوسائط (حتمية).
- ليس لها آثار جانبية (لا تعدل الحالة الخارجية، لا تقرأ متغيرات عامة، لا تقوم بإدخال/إخراج).
مثال على دالة بحتة:
fun sum(a: Int, b: Int): Int = a + bمثال على دالة غير بحتة (تعتمد على حالة خارجية):
var counter = 0fun impureSum(a: Int, b: Int): Int { counter++ // تأثير جانبي return a + b}الثبات
في البرمجة الوظيفية، من الممارسات الشائعة تجنب تغيير البيانات بعد إنشائها. في Kotlin، يتم استخدام ما يلي لهذا الغرض:
valبدلاً منvarللإعلان عن مراجع ثابتة.- مجموعات ثابتة:
listOf،mapOf،setOf. - نسخ الكائنات مع التعديلات عبر
copy()لفئات البيانات.
data class User(val name: String, val age: Int)
fun main() { val user = User("Alice", 25) val updatedUser = user.copy(age = 26) // إنشاء نسخة جديدة println(user) // User(name=Alice, age=25) println(updatedUser) // User(name=Alice, age=26)}مزايا الثبات: تبسيط التصحيح، أمان الخيوط، قابلية التنبؤ بالكود.
الدوال عالية الترتيب وتعبيرات لامدا
الدوال كقيم
في Kotlin، يمكن تمرير الدوال كوسائط، وإرجاعها من دوال أخرى، وتخزينها في متغيرات. هذا هو أساس الأسلوب الوظيفي.
// دالة تأخذ دالة أخرىfun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b)}
fun main() { val sum = operateOnNumbers(5, 3) { x, y -> x + y } val product = operateOnNumbers(5, 3) { x, y -> x * y } println("Sum: $sum, Product: $product")}تعبيرات لامدا
لامدا هي دالة مجهولة مكتوبة بشكل مضغوط. الصيغة: { arguments -> body }.
val square: (Int) -> Int = { x -> x * x }val result = square(4) // 16
// إذا كان هناك وسيطة واحدة، يمكنك استخدام الاسم الضمني itval double: (Int) -> Int = { it * 2 }الدوال عالية الترتيب المضمنة
توفر Kotlin العديد من الدوال المفيدة للعمل مع المجموعات:
map— تحويل كل عنصر.filter— الاحتفاظ بالعناصر التي تحقق شرطًا.fold— اختزال مجموعة إلى قيمة واحدة مع مركم أولي.
fun main() { val numbers = listOf(1, 2, 3, 4, 5)
// map: تربيع كل عنصر val squares = numbers.map { it * it } println(squares) // [1, 4, 9, 16, 25]
// filter: الاحتفاظ بالأرقام الزوجية فقط val evens = numbers.filter { it % 2 == 0 } println(evens) // [2, 4]
// fold: مجموع كل العناصر val sum = numbers.fold(0) { acc, element -> acc + element } println(sum) // 15
// تسلسل الدوال: المربعات الزوجية val evenSquares = numbers .filter { it %