1.map映射
//---------------映射--------------- val data1 = List[String]("abc", "ade", "xyz") //map 映射 val list1 = data1.map(data => data.toUpperCase) println(list1) //List(ABC, ADE, XYZ) //flatMap 扁平化 val list2 = data1.flatMap(data => data.toUpperCase) println(list2) //List(A, B, C, A, D, E, X, Y, Z) //filter 過濾 val list3 = data1.filter(data => data.startsWith("a")) println(list3) //List(abc, ade)
2.reduce歸約
//----------------reduce---------------- //reduceLeft和reduce一樣 求和,n1:結果;n2:當前元素。第一次的結果是第一個元素。 val reduceLeftSum: Int = (1 to 5).reduceLeft((n1, n2) => n1 + n2) println(s"reduceLeftSum = ${reduceLeftSum}") //15 //reduceLeft 求最大值 val reduceLeftMax: Int = (1 to 5).reduceLeft((n1, n2) => if (n1 > n2) n1 else n2) println(s"reduceLeftMax = ${reduceLeftMax}") //5 //reduceRight n1:當前元素;n2:結果。第一次的結果是第一個元素。 //1-(2-(3-(4-5))) val reduceRightSub: Int = (1 to 5).reduceRight((n1, n2) => n1 - n2) println(s"reduceRightSub = ${reduceRightSub}") //3
3.fold折疊
//左折疊左邊的參數就是結果,右折疊右邊的參數就是結果 //-------------------fold------------------- //左折疊。加了一個類似於java8中reduce方法的identity初始值,初始值作為第一次的結果 //案例1:將字符串中的字符添加到一個ArrayBuffer中 val foldLeft1: mutable.Seq[Char] = "scala".foldLeft(ArrayBuffer[Char]())((buffer, c) => buffer += c) println(s"foldLeft1 = ${foldLeft1}") //ArrayBuffer(s, c, a, l, a) //左折疊簡寫方式 val foldLeft2: mutable.Seq[Char] = (ArrayBuffer[Char]() /: "scala") ((buffer, c) => buffer += c) println(s"foldLeft2 = ${foldLeft2}") //ArrayBuffer(s, c, a, l, a) //案例2:統計字符串中字符的個數,保存在map中 val foldLeft3: mutable.Map[Char, Int] = (mutable.Map[Char, Int]() /: "scala") ((map, c) => map += (c -> (map.getOrElse(c, 0) + 1))) println(s"foldLeft3 = ${foldLeft3}") //Map(s -> 1, a -> 2, l -> 1, c -> 1) //右折疊 val foldRightSub1: Int = (1 to 5).foldRight(998)((n1, n2) => n1 - n2) println(s"foldRightSub1 = ${foldRightSub1}") //-995 //右折疊簡寫方式 val foldRightSub2: Int = ((1 to 5) :\ 998) ((n1, n2) => n1 - n2) println(s"foldRightSub2 = ${foldRightSub2}") //-995
4.scan掃描
//左掃描保留折疊的中間結果,初始值也保存 val scanLeft: immutable.Seq[Int] = (1 to 5).scanLeft(5)((n1, n2) => n1 - n2) //scanLeft = Vector(5, 4, 2, -1, -5, -10),左掃描的結果以左邊為基點,不停添加到右邊 println(s"scanLeft = ${scanLeft}") //右掃描 val scanRight = (1 to 5).scanRight(5)((n1, n2) => n1 - n2) //scanRight = Vector(-2, 3, -1, 4, 0, 5),左掃描的結果以右邊為基點,不停添加到左邊 println(s"scanRight = ${scanRight}")