המחלקה List כוללת את ההגדרה של המתודות reduceRight ו-reduceLeft. שתיהן פועלות באופן דומה רק שהאחת עושה את פעולתה מימין לשמאל והשניה משמאל לימין.
פעולת ה-reduce על הערכים שמוחזקים באובייקט מסוג List
המשמעות של פעולת ה-reduce היא לחשב ערך בודד בהתבסס על אוסף של ערכים תוך שימוש בפונקציה מסויימת אשר מופעלת שוב ושוב תוך כדי מעבר על הערכים.
קריאה להפעלת הפונקציה reduceLeft על אובייקט מסוג List
בדוגמת הקוד הבאה קיים אוסף של ערכים מספריים שלמים. כאשר קוראים להפעלת הפונקציה reduceLeft מתבצע מעבר על כל הערכים המספריים השלמים משמאל לימין. בתחילה נשלחים לפונקציה ששלחנו שני הערכים הראשונים בקצה השמאלי של הרשימה והתוצאה מייד אחר כך נשלחת שוב לאותה פונקציה ששלחנו ל-reduceLeft יחד עם הערך הבא (הערך השלישי ברשימה).
package com.lifemichael.samples
object ReduceDemo {
def main(args: Array[String]): Unit = {
var numbers: List[Int] = List(2, 4, 6, 8, 3, 1)
def f(num1: Int, num2: Int): Int = {
var result: Int = if (num2 > num1) num2 else num1
println(s"inside f num1=$num1 num2=$num2 result=$result")
result
}
println("calling reduceLeft")
var number1: Int = numbers.reduceLeft(f)
println(number1)
}
}
הפלט שמתקבל מהרצת הקוד מעיד על כך שבהפעלה של הפונקציה f, הפונקציה אשר נשלחה ל-reduceLeft, נשלחו בכל פעם שני ערכים מתוך הרשימה. בהפעלה הראשונה של f נשלחו שני הערכים הראשונים משמאל. בהפעלה השניה נשלחו שני ערכים שמורכבים מהערך שהוחזר בהפעלה הראשונה והערך השלישי, וכך הלאה.
קריאה להפעלת הפונקציה reduceRight על אובייקט מסוג List
בדוגמת הקוד הבאה קיים אוסף של ערכים מספריים שלמים. כאשר קוראים להפעלת הפונקציה reduceRight מתבצע מעבר על כל הערכים המספריים השלמים משמאל לימין. בתחילה נשלחים לפונקציה ששלחנו שני הערכים הראשונים בקצה הימני של הרשימה והתוצאה מייד אחר כך נשלחת שוב לאותה פונקציה ששלחנו ל-reduceRight יחד עם הערך הבא (הערך השלישי ברשימה).
package com.lifemichael.samples
object ReduceDemo {
def main(args: Array[String]): Unit = {
var numbers: List[Int] = List(2, 4, 6, 8, 3, 1)
def f(num1: Int, num2: Int): Int = {
var result: Int = if (num2 > num1) num2 else num1
println(s"inside f num1=$num1 num2=$num2 result=$result")
result
}
println("calling reduceRight")
var number1: Int = numbers.reduceRight(f)
println(number1)
}
}
הפלט שמתקבל מהרצת הקוד מעיד על כך שבהפעלה של הפונקציה f, הפונקציה אשר נשלחה ל-redeuceRight, נשלחו בכל פעם שני ערכים מתוך הרשימה. בהפעלה הראשונה של f נשלחו שני הערכים הראשונים מימין. בהפעלה השניה נשלחו שני ערכים שמורכבים מהערך שהוחזר בהפעלה הראשונה והערך השלישי מימין, וכך הלאה.
קיימות פונקציות דומות אשר פועלות באופן מעט שונה, כגון foldLeft ו-foldRight, אשר להן נקדיש פוסט אשר ייכתב בנפרד.