Scala 常用集合操作函數-map、reduce、fold、scan


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}")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM