الدالة ‎‎all()‎ في Kotlin

من موسوعة حسوب

تتحقق الدالة all()‎ إن كانت كافّة عناصر المصفوفة أو المجموعة (collection) التي استُدعيت عبرها تطابق شرطًا منطقيًّا محدَّدًا.

البنية العامة

يمكن استدعاء الدالة all()‎ للمصفوفات من الأنواع المختلفة كما يلي:

inline fun <T> Array<out T>.all(predicate: (T) -> Boolean): Boolean 
inline fun ByteArray.all(predicate: (Byte) -> Boolean): Boolean 
inline fun ShortArray.all(predicate: (Short) -> Boolean): Boolean 
inline fun IntArray.all(predicate: (Int) -> Boolean): Boolean 
inline fun LongArray.all(predicate: (Long) -> Boolean): Boolean
inline fun FloatArray.all(predicate: (Float) -> Boolean): Boolean 
inline fun DoubleArray.all(predicate: (Double) -> Boolean): Boolean 
inline fun BooleanArray.all(predicate: (Boolean) -> Boolean): Boolean
inline fun CharArray.all(predicate: (Char) -> Boolean): Boolean

وكذلك للعناصر القابلة للتكرار (Iterables):

inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean

وكذلك لعناصر الخرائط (maps):

inline fun <K, V> Map<out K, V>.all( predicate: (Entry<K, V>) -> Boolean): Boolean

ويُلاحَظ وجود الكلمة المفتاحية inline للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع توثيق الدوال المباشرة (inline functions).

القيم المعادة

تُعاد القيمة true إن كانت كافّة عناصر المصفوفة أو العناصر القابلة للتكرار (Iterable) التي استُدعيت معها تحقق العبارة المنطقية (predicate) المُحدَّدة، أو false بخلاف ذلك.

أمثلة

استخدام الدالة ()all مع المجالات (Ranges):

تعرِّف الشيفرة الآتية دالةً (بصيغة lambda) باسم isEven()‎ ، تعيد هذه الدالة القيمة true إن كان معاملها (والمتمثل بالاسم الضمني it) زوجيًا أو القيمةfalse إن كان فرديًا (يكون باقي القسمة على 2 مساويًا للصفر في العدد الزوجي)، كما وتعرِّف الشيفرة مجالًا (range) باسم  zeroToTen يبدأ بالقيمة 1 وينتهي بالقيمة 10، ثم تُستخدَم الدالة all()‎ للتحقق من أنّ كل عناصر المجال zeroToTen زوجيّة إذ إنّ الدالة isEven هي العبارة المنطقية (predicate) التي يجب أن تحققها جميع عناصر المجال، وستكون النتيجة false لوجود أعداد فردية في ذلك المجال:

fun main(args: Array<String>) {
    val isEven: (Int) -> Boolean = { it % 2 == 0 } // تعريف دالة
    val zeroToTen = 0..10 // تعريف مجال
    println(zeroToTen.all(isEven)) // false
}

وللحصول على القيمة المنطقية true سنلجأ لضرب كل عناصر المجال بالعدد 2 وذلك بالاعتماد على map وتخزين القيم الناتجة في المتغيّر evens كما في الشيفرة:

    val evens = zeroToTen.map { it * 2 } // ضرب عناصر المجال بالعدد 2
    println(evens.all(isEven)) // true

استخدام الدالة ()all مع مصفوفة فارغة (Empty Array): تعرِّف الشيفرة الآتية دالةً (بصيغة lambda) باسم isEven()‎ ، تعيد هذه الدالة القيمة true إن كان معاملها (والمتمثل بالاسم الضمني it) زوجيًا أو القيمةfalse إن كان فرديًا (يكون باقي القسمة على 2 مساويًا للصفر في العدد الزوجي)، كما وتعرِّف مصفوفةً فارغةً وتتحقق بواسطة الدالة all()‎ من أن كافّة عناصرها زوجية، وستكون النتيجة true لأنها فارغة:

fun main(args: Array<String>) { 
    val isEven: (Int) -> Boolean = { it % 2 == 0 } // تعريف دالة
    val evens = emptyArray<Int>()
    println(evens.all(isEven)) // true
}

انظر أيضًا

  • الدالة any()‎: للتأكد من أن عنصرًا واحدًا على الأقل من المصفوفة يحقّق العبارة المنطقية (predicate) المُحدَّدة.

مصادر