scala中常用的函數式編程

一 map映射

有如下數組

val d = Array(1, 2, 3, 4, 5, 6)

我們現在要對數組裏的每個元素乘以2

d.map((x: Int) => x * 2)

上面左邊的"x"的意思就是數組中的每個元素, "=>"的意思就是我們需要對x做什麼操作,這裏是乘以2
上面的公式就相當於我們高中時的y=f(x)=2*x,我們看下結果
在這裏插入圖片描述
上面的map映射我們也可以簡寫:

d.map(x => x * 2)
// "_" 代表每個元素
d.map(_ * 2)

二 filter過濾

有如下數組,我們需要拿到大於3的元素

val f = Array(1, 2, 3, 4, 5)

可以通過下面這個方法:

f.filter(x => x>3)
f.filter(_ > 3)

在這裏插入圖片描述
假如需要對數組每個元素乘以2之後再進行大於4的過濾,我們可以用鏈式編程的方式:

f.map(_ * 2).filter(_ > 4)

在這裏插入圖片描述

三 reduce

有如下數組:

val f = Array(1, 2, 3, 4, 5)

我們做reduce操作

f.reduce((a,b)=> a-b)

在這裏插入圖片描述
到這裏,我們可能不清楚裏面發生了什麼?我們可以把a,b打印出來,看看過程

f.reduce((a,b)=>{
  println(a+" , "+b)
  a-b
})

整個過程就是1-2=-1,然後結果-1再去減後面的數,-1-3=-4,-4-4=-8,-8-5=-13,也就是這樣減的

 (((1-2)-3)-4)-5
=((-1-3)-4)-5
=(-4-4)-5
=-8-5
=-13

在這裏插入圖片描述
reduce還有reduceLeft和reduceRigtht,我們先來看看reduceLeft

f.reduceLeft((a, b) => {
    println(a + ", " + b)
    a - b
})

從結果可以看出來,reduce默認走的是reduceLeft
在這裏插入圖片描述
我們再看看reduceRigtht

f.reduceRight((a, b) => {
    println(a + ", " + b)
    a - b
})

也就是這樣減的

 1-(2-(3-(4-5)))
=1-(2-(3-(-1)))
=1-(2-4)
=1-(-2)
=3

在這裏插入圖片描述

四 zip

 val g = Array(1, 2, 3, 4)
 val l = Array("a", "b", "c", "d")

有上面2個數組,我們要把數組合並再一起,可以通過下面命令

g.zip(l)

在這裏插入圖片描述
假如一個數組比另外個數組的元素數量多,合併的話,會發生什麼

 val g = Array(1, 2, 3, 4, 5)
 val l = Array("a", "b", "c", "d")

從下面可以看出,多餘的會剔除掉
在這裏插入圖片描述

五 flatten

val h = Array(Array(1, 2, 3), Array(2, 1), Array(3, 5))

如上面結果,數組中又有數組,我們需要把裏面的元素攤平到一個數組裏

h.flatten

在這裏插入圖片描述
還有一個flatMap的算子,如果對h的數據先進行乘以2,再打平可以用flatMap

h.flatMap(x => x.map(t=> t*2))

在這裏插入圖片描述

六 groupBy/sortBy

val arrs = Array(("a", 10), ("b", 20), ("a", 20), ("c", 30))

要對上面的數據進行分組,比如我們按照第一個字符進行分組

arrs.groupBy(x => x._1)

x爲上面數據的(“a”,10),然後x._1就是x的第一個元素
在這裏插入圖片描述
對數組進行排序,比方說,對第二個數值進行排序

arrs.sortBy(x => x._2)

在這裏插入圖片描述
如果降序,只要添加個負號即可

arrs.sortBy(x => -x._2)

在這裏插入圖片描述

七 案例-求wordcount並降序

針對下面的數據求wordcount

 val wc = Array("hello,world,hello", "hello,world")

第一步:先把每個元素按照","進行拆分

val split: Array[Array[String]] = wc.map(_.split(","))

在這裏插入圖片描述

第二步:把數組裏的數組打平

val flatten: Array[String] = split.flatten

在這裏插入圖片描述
第三步:給每個元素都加上一個1對應起來

val mapAddOne: Array[(String, Int)] = flatten.map(x=>(x,1))

在這裏插入圖片描述
第四步:對每個word進行分組

val groupBy:Map[String,Array[(String,Int)]] = mapAddOne.groupBy(x => x._1)

在這裏插入圖片描述
第五步:保留key,針對map的value進行操作,只保留value中的Int

val mapArray:Map[String,Array[Int]] = groupBy.mapValues(x => x.map(y => y._2))

這裏的mapValues,是保留key,對value進行操作,所以上面的x代表的是value裏的Array
在這裏插入圖片描述
第六步:繼續保留key,對value進行求和

val sum:Map[String,Int] = mapArray.mapValues(x => x.sum)

在這裏插入圖片描述
第七步:把Map轉換成Array

val sumArray:Array[(String,Int)] = sum.toArray

在這裏插入圖片描述
第八步:降序

val result:Array[(String,Int)] = sumArray.sortBy(x => -x._2)

在這裏插入圖片描述
到這裏完成了案例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章