一 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)
到這裏完成了案例