نگاهی دیگر به لیست ها
لیست ها در سکالا و زبان های functional دیگر از دوقسمت head و tail تشکیل شدند
لیست در سکالا با دو روش نوشته میشه روش اول که باهاش آشنا هستیم
val list = List(1,2,3)
روش دوم
val list = 1 :: 2:: 3 :: Nil
ایندو یکی هستن در اینجا :: head به tail بعدی اضافه میکنه و cons نامیده میشه
سکالا قابلیت های pattern matching بسیار قوی داره
def sum(list: List[Int]): Int = {
list match {
case Nil => 0
case h :: t => h + sum(t)
}
}
در بالا اگربه لیست با چند عدد برسیم عدد head اضافه میکنیم بصورت برگشتی به ادامه لیست تا به ته لیست برسیم Nil و صفر برگردونیم
چند تابع کاربردی که بعد ها بیشتر درموردشون صحبت میکنیم
map
function داده شده رو روی تمامه داده های لیست اجرا کرده و لیست جدید برمیگردونه
list.map{ (x) => x *2 }.map(_*3)
//res5: List[Int] = List(6, 12, 18, 24)
filter
function boolean میگیره و هر داده تو لیست که این function true جواب بده تو لیست جدید برمیگردونه
list.filter(_>2)
//res6: List[Int] = List(3, 4)
reduce
تابع دو تایی روی داده های لیست به صورت جفت انجام میده و نتیجه با تایپه داخل لیست رو برمیگردونه
list.reduce((x,y) => x*y)
//res13: Int = 24
flatten
اگر لیست داخلش لیست دیگری باشه داده های لیست درونی فقط درون لیست برمیگردونه
List(List(1,2,3)).flatten
//res15: List[Int] = List(1, 2, 3)
flatMap
ترکیب map و flatten که لیست لیست و میگیره و ی تابع رو آنها انجام میده و نتیجه به صورت یک لیست برمیگردونه
List(List(1, 2), List(3, 4)).flatMap(x => x.map(_ * 2))
//res16: List[Int] = List(2, 4, 6, 8)