الفرق بين المراجعتين لصفحة: «Kotlin/collections/reduce»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: الدالة <code>reduce()‎</code> في لغة Kotlin}}</noinclude> يختلف سلوك الدالة<code>reduce()‎</code> حسب نوع...'
 
طلا ملخص تعديل
 
(8 مراجعات متوسطة بواسطة 3 مستخدمين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: الدالة <code>reduce()‎</code> في لغة Kotlin}}</noinclude>
<noinclude>{{DISPLAYTITLE: الدالة <code>reduce()‎</code> في Kotlin}}</noinclude>
يختلف سلوك الدالة<code>reduce()‎</code> حسب نوع المعاملات (parameters) المُمرّرة إليها (انظر فقرة [[Kotlin/collections/fold#.D8.A7.D9.84.D8.A8.D9.86.D9.8A.D8.A9 .D8.A7.D9.84.D8.B9.D8.A7.D9.85.D8.A9|البنية العامة]]).  
تُراكِم الدالة <code>reduce()‎</code> قيمة عنصر بدءًا من العنصر الأول عبر تطبيق عملية معينة من يسار العناصر المعطاة إلى يمينها على القيمة المتراكمة الحالية وعلى العنصر التالي ثم تُعيد قيمة العنصر النهائي الناتج.  
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
inline fun <T, R> Array<out T>.fold(
inline fun <S, T : S> Array<out T>.reduce(
    initial: R,
     operation: (acc: S, T) -> S
     operation: (acc: R, T) -> R
): S
): R
inline fun ByteArray.reduce(
inline fun <R> ByteArray.fold(
     operation: (acc: Byte, Byte) -> Byte
    initial: R,
): Byte
     operation: (acc: R, Byte) -> R
inline fun ShortArray.reduce(
): R
     operation: (acc: Short, Short) -> Short
inline fun <R> ShortArray.fold(
): Short
    initial: R,
inline fun IntArray.reduce(
     operation: (acc: R, Short) -> R
     operation: (acc: Int, Int) -> Int
): R
): Int
inline fun <R> IntArray.fold(
inline fun LongArray.reduce(
    initial: R,
     operation: (acc: Long, Long) -> Long
     operation: (acc: R, Int) -> R
): Long
): R
inline fun FloatArray.reduce(
inline fun <R> LongArray.fold(
     operation: (acc: Float, Float) -> Float
    initial: R,
): Float
     operation: (acc: R, Long) -> R
inline fun DoubleArray.reduce(
): R
     operation: (acc: Double, Double) -> Double
inline fun <R> FloatArray.fold(
): Double
    initial: R,
inline fun BooleanArray.reduce(
     operation: (acc: R, Float) -> R
     operation: (acc: Boolean, Boolean) -> Boolean
): R
): Boolean
inline fun <R> DoubleArray.fold(
inline fun CharArray.reduce(
    initial: R,
     operation: (acc: Char, Char) -> Char
     operation: (acc: R, Double) -> R
): Char
): R
inline fun <S, T : S> Iterable<T>.reduce(
inline fun <R> BooleanArray.fold(
     operation: (acc: S, T) -> S
    initial: R,
): S
     operation: (acc: R, Boolean) -> R
): R
inline fun <R> CharArray.fold(
    initial: R,
     operation: (acc: R, Char) -> R
): R
inline fun <T, R> Iterable<T>.fold(
    initial: R,
     operation: (acc: R, T) -> R
): R


</syntaxhighlight>تُراكِم الدالة<code>reduce()‎</code> القيم بدءًا من القيمة المُمرّرة <code>initial</code> وتطبّق العملية <code>operation</code> من اليسار إلى اليمين على القيمة المُتراكمة الراهنة وعلى العنصر الموالي في [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت عبرها. ثم تُعيد القيمة النهائية.<syntaxhighlight lang="kotlin">
</syntaxhighlight>تُراكِم الدالة <code>reduce()‎</code> القيم بدءًا من العنصر الأول ثمَّ تطبّق العملية <code>operation</code> من اليسار إلى اليمين على القيمة المُتراكمة الراهنة وعلى العنصر التالي في [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت معها وتُعيد القيمة النهائية.<syntaxhighlight lang="kotlin">
inline fun <T, K, R> Grouping<T, K>.fold(
inline fun <S, T : S, K> Grouping<T, K>.reduce(
    initialValueSelector: (key: K, element: T) -> R,
     operation: (key: K, accumulator: S, element: T) -> S
     operation: (key: K, accumulator: R, element: T) -> R
): Map<K, S>
): Map<K, R>
</syntaxhighlight>'''بيئة التشغيل:''' Kotlin 1.1.
</syntaxhighlight>تُجمّع الدالة<code>reduce()‎</code> القيم من المصدر <code>[[Kotlin/collections/Grouping|Grouping]]</code> حسب المفاتيح (keys) وتطبّق العملية <code>operation</code> على عناصر كل مجموعة (group) بشكل متتابع، فتُمرّر  قيمة التراكم الراهنة والعنصر الراهن كوسيطين (arguments)، وتخزّن النتائج في [[Kotlin/collections/Map|قاموس]] جديد. القيمة الأولية توفّرها الدالة <code>initialValueSelector</code> التي تُزوّد الدالة <code>fold()‎</code> بقيمة أولية لكل مجموعة (group). ثم تعيد  [[Kotlin/collections/Map|قاموسًا]] يربط بين مفاتيح كل مجموعة (group) مع نتيجة تراكم عناصرها.<syntaxhighlight lang="kotlin">
inline fun <T, K, R> Grouping<T, K>.fold(
    initialValue: R,
    operation: (accumulator: R, element: T) -> R
): Map<K, R>
</syntaxhighlight>تُجمّع الدالة<code>reduce()‎</code> القيم من المصدر <code>[[Kotlin/collections/Grouping|Grouping]]</code> حسب المفاتيح (keys) وتطبّق العملية <code>operation</code> على عناصر كل مجموعة  (group) بشكل متتابع، فتُمرّر  قيمة التراكم الراهنة والعنصر الراهن كوسيطين (arguments)، وتخزّن النتائج في [[Kotlin/collections/Map|قاموس]] جديد. القيمة الأولية هي الوسيط الممرّر  <code>initialValue</code>. ثم تعيد  [[Kotlin/collections/Map|قاموسًا]] يربط بين مفاتيح كل مجموعة (group) مع نتيجة تراكم عناصرها.


يُلاحَظ وجود الكلمة المفتاحية <code>inline</code> للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع <nowiki/>[[Kotlin/inline functions|توثيق الدوال المباشرة (inline functions)]].
تُجمّع الدالة <code>reduce()‎</code> القيم من المصدر <code>[[Kotlin/collections/Grouping|Grouping]]</code> بحسب المفاتيح (keys) ثمَّ تطبّق العملية <code>operation</code> على عناصر كل مجموعة (group) بشكل متتابع بدءًا بالعنصر الثاني من المجموعة (group)، إذ تُمرّر قيمة التراكم الراهنة والعنصر الراهن كوسيطين (arguments) ويخزّن الناتج في خريطة جديد. تعدُّ القيمة الأولية المُمرّرة إلى المراكم <code>accumulator</code> هي العنصر الأول في المجموعة (group).


==القيم المٌعادة==
تعيد الدالة <code>reduce()‎</code> خريطةً تربط بين مفاتيح كل مجموعة (group) مع نتيجة تراكم عناصرها.
انظر فقرة [[Kotlin/collections/fold#.D8.A7.D9.84.D8.A8.D9.86.D9.8A.D8.A9 .D8.A7.D9.84.D8.B9.D8.A7.D9.85.D8.A9|البنية العامة]].  
 
وجود الكلمة المفتاحية <code>inline</code> يدل على أنَّ هذه الدالة مباشرة (للمزيد من التفاصيل، راجع صفحة [[Kotlin/inline functions|الدوال المباشرة (inline functions)]]). 
 
== المعاملات ==
 
=== <code>operation</code> ===
دالة يراد تطبيقها على كل عنصر من عناصر الكائن المعطاة. يمرر إليها القيمة المتراكمة الحالية (التي تمثل عنصرًا) وقيمة العنصر الحالي الذي ستطبق عليه هذه الدالة ثم تحسب قيمة العنصر المتراكم التالي.
 
==القيم المعادة==
يعاد العنصر الذي يمثل القيمة النهائية الناتجة عن تطبيق العملية <code>operation</code> بشكل تراكمي من اليسار إلى اليمين على كل عنصر من عناصر الكائن المعطى.
==أمثلة==
==أمثلة==
===استخدام الدالة <code>()reduce</code> مع المصفوفات===
استعمال الدالة <code>()reduce</code> لتجميع أعداد موجودة في مصفوفة:<syntaxhighlight lang="kotlin">
تعرف الشيفرة الآتية <nowiki/>[[Kotlin/Array|مصفوفة]] باسم <code>array</code>مكونة من ستة أعداد باستخدام الدالة <code>()arrayOf</code>، ثم تستخدم الدالة <code>()reduce</code> على <code>array</code> بتمرير القيمة الأوّلية <code>0</code> إضافة إلى عملية الإضافة، ثم تطبع الناتج:<syntaxhighlight lang="kotlin">
fun main(args: Array<String>) {
fun main(args: Array<String>) {
val array = arrayOf(1,2,3,4,5,6)
    val array = arrayOf(1,2,3,4,5,6)
 
    val acc = array.reduce { sum, element -> sum + element }
    print(acc) // 21
}</syntaxhighlight>


val acc = array.fold(0) { sum, element -> sum + element }
print(acc) // 21
}
</syntaxhighlight>
==انظر أيضًا==
==انظر أيضًا==
* <code>[[Kotlin/collections/foldIndexed|foldIndexed()]]</code>: تُراكِم القيم بدءًا من القيمة المُمرّرة <code>initial</code> وتطبّق العملية <code>operation</code> من اليسار إلى اليمين على القيمة المُتراكمة الراهنة وعلى العنصر التالي من [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت عبرها وكذلك فهرسه. وتُعيد القيمة النهائية. 
*الدالة <code>[[Kotlin/collections/reduceRight|reduceRight()]]</code>: تجمع بشكل تراكمي ناتج تطبيق عملية معيَّنة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها والقيمة التراكمية الحالية. 
 
*الدالة <code>[[Kotlin/collections/reduceIndexed|reduceIndexed()]]</code>‎: ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليسار إلى اليمين) المستدعاة معها وفهرس ذلك العنصر بشكل تراكمي والقيمة المجمَّعة الحالية.
*الدالة <code>[[Kotlin/collections/reduceRightIndexed|reduceRightIndexed()‎]]</code>: تجمع الناتج التراكمي لتطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها وفهرس ذلك العنصر والقيمة المجمَّعة الحالية.
*الدالة <code>[[Kotlin/collections/groupBy|groupBy()‎]]</code>: تجمِّع عناصر <nowiki/>[[Kotlin/Array|المصفوفة]] أو <nowiki/>[[Kotlin/collections|المجموعة]] التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من العناصر المقابلة.
*الدالة <code>[[Kotlin/collections/fold|fold()‎]]</code> تراكميًّا ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر الكائن المستدعى معها والقيمة التراكمية الحالية بالإضافة إلى قيمة أولية إن أعطيت، ويختلف سلوكها بحسب نوع الكائنات المستدعاة معها والمعاملات المُمرّرة إليها 
==مصادر==
==مصادر==
*[https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/fold.html الدالة  reduce()‎ في التوثيق الرسميّ للمكتبة القياسيّة في لغة Kotlin.]
*[https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reduce.html صفحة الدالة reduce()‎ في التوثيق الرسميّ للمكتبة القياسيّة في لغة Kotlin.]
[[تصنيف:Kotlin]]
[[تصنيف:Kotlin]]
[[تصنيف:Kotlin Functions]]
[[تصنيف:Kotlin Function]]
[[تصنيف:Kotlin Collection]]

المراجعة الحالية بتاريخ 10:11، 8 سبتمبر 2018

تُراكِم الدالة reduce()‎ قيمة عنصر بدءًا من العنصر الأول عبر تطبيق عملية معينة من يسار العناصر المعطاة إلى يمينها على القيمة المتراكمة الحالية وعلى العنصر التالي ثم تُعيد قيمة العنصر النهائي الناتج.

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

inline fun <S, T : S> Array<out T>.reduce(
    operation: (acc: S, T) -> S
): S 
inline fun ByteArray.reduce(
    operation: (acc: Byte, Byte) -> Byte
): Byte 
inline fun ShortArray.reduce(
    operation: (acc: Short, Short) -> Short
): Short 
inline fun IntArray.reduce(
    operation: (acc: Int, Int) -> Int
): Int 
inline fun LongArray.reduce(
    operation: (acc: Long, Long) -> Long
): Long 
inline fun FloatArray.reduce(
    operation: (acc: Float, Float) -> Float
): Float 
inline fun DoubleArray.reduce(
    operation: (acc: Double, Double) -> Double
): Double 
inline fun BooleanArray.reduce(
    operation: (acc: Boolean, Boolean) -> Boolean
): Boolean 
inline fun CharArray.reduce(
    operation: (acc: Char, Char) -> Char
): Char 
inline fun <S, T : S> Iterable<T>.reduce(
    operation: (acc: S, T) -> S
): S

تُراكِم الدالة reduce()‎ القيم بدءًا من العنصر الأول ثمَّ تطبّق العملية operation من اليسار إلى اليمين على القيمة المُتراكمة الراهنة وعلى العنصر التالي في المصفوفة أو المجموعة التي استُدعيت معها وتُعيد القيمة النهائية.

inline fun <S, T : S, K> Grouping<T, K>.reduce(
    operation: (key: K, accumulator: S, element: T) -> S
): Map<K, S>

بيئة التشغيل: Kotlin 1.1.

تُجمّع الدالة reduce()‎ القيم من المصدر Grouping بحسب المفاتيح (keys) ثمَّ تطبّق العملية operation على عناصر كل مجموعة (group) بشكل متتابع بدءًا بالعنصر الثاني من المجموعة (group)، إذ تُمرّر قيمة التراكم الراهنة والعنصر الراهن كوسيطين (arguments) ويخزّن الناتج في خريطة جديد. تعدُّ القيمة الأولية المُمرّرة إلى المراكم accumulator هي العنصر الأول في المجموعة (group).

تعيد الدالة reduce()‎ خريطةً تربط بين مفاتيح كل مجموعة (group) مع نتيجة تراكم عناصرها.

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

المعاملات

operation

دالة يراد تطبيقها على كل عنصر من عناصر الكائن المعطاة. يمرر إليها القيمة المتراكمة الحالية (التي تمثل عنصرًا) وقيمة العنصر الحالي الذي ستطبق عليه هذه الدالة ثم تحسب قيمة العنصر المتراكم التالي.

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

يعاد العنصر الذي يمثل القيمة النهائية الناتجة عن تطبيق العملية operation بشكل تراكمي من اليسار إلى اليمين على كل عنصر من عناصر الكائن المعطى.

أمثلة

استعمال الدالة ()reduce لتجميع أعداد موجودة في مصفوفة:

fun main(args: Array<String>) {
    val array = arrayOf(1,2,3,4,5,6)

    val acc = array.reduce { sum, element -> sum + element }
    print(acc) // 21
}

انظر أيضًا

  • الدالة reduceRight()‎: تجمع بشكل تراكمي ناتج تطبيق عملية معيَّنة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها والقيمة التراكمية الحالية. 
  • الدالة reduceIndexed()‎: ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليسار إلى اليمين) المستدعاة معها وفهرس ذلك العنصر بشكل تراكمي والقيمة المجمَّعة الحالية.
  • الدالة reduceRightIndexed()‎: تجمع الناتج التراكمي لتطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها وفهرس ذلك العنصر والقيمة المجمَّعة الحالية.
  • الدالة groupBy()‎: تجمِّع عناصر المصفوفة أو المجموعة التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من العناصر المقابلة.
  • الدالة fold()‎ تراكميًّا ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر الكائن المستدعى معها والقيمة التراكمية الحالية بالإضافة إلى قيمة أولية إن أعطيت، ويختلف سلوكها بحسب نوع الكائنات المستدعاة معها والمعاملات المُمرّرة إليها 

مصادر