帶你快速掌握Scala操作———(3)

1、函數

scala支持函數式編程,將來編寫Spark/Flink程序中,會大量使用到函數
定義函數

語法

val 函數變量名 = (參數名:參數類型, 參數名:參數類型....) => 函數體


	函數是一個對象(變量)
	類似於方法,函數也有輸入參數和返回值
	函數定義不需要使用def定義
	無需指定返回值類型

參考代碼

scala> val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>

scala> add(1,2)
res3: Int = 3

方法和函數的區別

	方法是隸屬於類或者對象的,在運行時,它是加載到JVM的方法區中
	可以將函數對象賦值給一個變量,在運行時,它是加載到JVM的堆內存中
	函數是一個對象,繼承自FunctionN,函數對象有apply,curried,toString,tupled這些方法。方法則沒有

示例

方法無法賦值給變量
scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Int

scala> val a = add
<console>:12: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.
       val a = add

方法轉換爲函數

•	有時候需要將方法轉換爲函數,作爲變量傳遞,就需要將方法轉換爲函數
•	使用_即可將方法轉換爲函數

參考代碼

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Int

scala> val a = add _
a: (Int, Int) => Int = <function2>

2、數組

cala中,有兩種數組,一種是定長數組,另一種是變長數組

定長數組

	定長數組指的是數組的長度是不允許改變的
	數組的元素是可以改變的

語法

// 通過指定長度定義數組

val/var 變量名 = new Array[元素類型](數組長度)

// 用元素直接初始化數組

val/var 變量名 = Array(元素1, 元素2, 元素3...)

 在scala中,數組的泛型使用[]來指定
 使用()來獲取元素

參考代碼

scala> val a = new Array[Int](100)
a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> a(0) = 110

scala> println(a(0))
110

變長數組

變長數組指的是數組的長度是可變的,可以往數組中添加、刪除元素
變長數組

創建變長數組,需要提前導入ArrayBuffer類
import scala.collection.mutable.ArrayBuffer

語法

創建空的ArrayBuffer變長數組,語法結構:

•	val/var a = ArrayBuffer[元素類型]()

創建帶有初始元素的ArrayBuffer

•	val/var a = ArrayBuffer(元素1,元素2,元素3....)

示例一

定義一個長度爲0的整型變長數組

參考代碼

val a = ArrayBuffer[Int]()

示例二

定義一個包含"hadoop", "storm", "spark"元素的變長數組

參考代碼

scala> val a = ArrayBuffer("hadoop", "storm", "spark")
a: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(hadoop, storm, spark)

添加/修改/刪除元素

	使用+=添加元素
	使用-=刪除元素
	使用++=追加一個數組到變長數組

參考代碼

// 定義變長數組
scala> val a = ArrayBuffer("hadoop", "spark", "flink")
a: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(hadoop, spark, flink)

// 追加一個元素
scala> a += "flume"
res10: a.type = ArrayBuffer(hadoop, spark, flink, flume)

// 刪除一個元素
scala> a -= "hadoop"
res11: a.type = ArrayBuffer(spark, flink, flume)

// 追加一個數組
scala> a ++= Array("hive", "sqoop")
res12: a.type = ArrayBuffer(spark, flink, flume, hive, sqoop)

遍歷數組

可以使用以下兩種方式來遍歷數組:
	使用for表達式直接遍歷數組中的元素
	使用索引遍歷數組中的元素

參考代碼

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> for(i<-a) println(i)
1
2
3
4
5

參考代碼

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> for(i <- 0 to a.length - 1) println(a(i))
1
2
3
4
5

scala> for(i <- 0 until a.length) println(a(i))
1
2
3
4
5



	0 until n——生成一系列的數字,包含0,不包含n
	0 to n ——包含0,也包含n

數組常用算法

以下爲常用的幾個算法:

	求和——sum方法
	求最大值——max方法
	求最小值——min方法
	排序——sorted方法
// 升序排序
scala> a.sorted
res53: Array[Int] = Array(1, 2, 4, 4, 10)

// 降序
scala> a.sorted.reverse
res56: Array[Int] = Array(10, 4, 4, 2, 1)

3、元組

元組可以用來包含一組不同類型的值。例如:姓名,年齡,性別,出生年月。元組的元素是不可變的。

定義元組

使用括號來定義元組

val/var 元組 = (元素1, 元素2, 元素3....)

使用箭頭來定義元組(元組只有兩個元素)

val/var 元組 = 元素1->元素2

參考代碼

scala> val a = ("zhangsan", 20)
a: (String, Int) = (zhangsan,20)

scala> val a = "zhangsan" -> 20
a: (String, Int) = (zhangsan,20)

訪問元組

使用_1、_2、_3....來訪問元組中的元素,_1表示訪問第一個元素,依次類推

參考代碼

scala> val a = "zhangsan" -> "male"
a: (String, String) = (zhangsan,male)

// 獲取第一個元素
scala> a._1
res41: String = zhangsan

// 獲取第二個元素
scala> a._2
res42: String = male

4、列表

列表是scala中最重要的、也是最常用的數據結構。List具備以下性質:
	可以保存重複的值
	有先後順序
在scala中,也有兩種列表,一種是不可變列表、另一種是可變列表

定義

不可變列表就是列表的元素、長度都是不可變的。

語法

val/var 變量名 = List(元素1, 元素2, 元素3...)

使用Nil創建一個不可變的空列表

val/var 變量名 = Nil

使用::方法創建一個不可變列表

val/var 變量名 = 元素1 :: 元素2 :: Nil

使用::拼接方式來創建列表,必須在最後添加一個Nil

示例一

創建一個不可變列表,存放以下幾個元素(1,2,3,4

參考代碼

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

示例二

使用Nil創建一個不可變的空列表

參考代碼

scala> val a = Nil
a: scala.collection.immutable.Nil.type = List()

示例三

使用::方法創建列表,包含-2-1兩個元素

參考代碼

scala> val a = -2 :: -1 :: Nil
a: List[Int] = List(-2, -1)

可變列表

可變列表就是列表的元素、長度都是可變的。
要使用可變列表,先要導入import scala.collection.mutable.ListBuffer
	可變集合都在mutable包中
	不可變集合都在immutable包中(默認導入)

定義

使用ListBuffer元素類型創建空的可變列表,語法結構:

val/var 變量名 = ListBuffer[Int]()

使用ListBuffer(元素1, 元素2, 元素3…)創建可變列表,語法結構:

val/var 變量名 = ListBuffer(元素1,元素2,元素3...)

示例一

創建空的整形可變列表

參考代碼

  scala> val a = ListBuffer[Int]()
  a: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

示例二

 
創建一個可變列表,包含以下元素:1,2,3,4

參考代碼

scala> val a = ListBuffer(1,2,3,4)
a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4)

可變列表操作

	獲取元素(使用括號訪問(索引值))
	添加元素(+=)
	追加一個列表(++=)
	更改元素(使用括號獲取元素,然後進行賦值)
	刪除元素(-=)
	轉換爲List(toList)
	轉換爲Array(toArray)

示例

1.	定義一個可變列表包含以下元素:1,2,3
2.	獲取第一個元素
3.	添加一個新的元素:4
4.	追加一個列表,該列表包含以下元素:5,6,7
5.	刪除元素7
6.	將可變列表轉換爲不可變列表
7.	將可變列表轉換爲數組

參考代碼

// 導入不可變列表
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

// 創建不可變列表
scala> val a = ListBuffer(1,2,3)
a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3)

// 獲取第一個元素
scala> a(0)
res19: Int = 1

// 追加一個元素
scala> a += 4
res20: a.type = ListBuffer(1, 2, 3, 4)

// 追加一個列表
scala> a ++= List(5,6,7)
res21: a.type = ListBuffer(1, 2, 3, 4, 5, 6, 7)

// 刪除元素
scala> a -= 7
res22: a.type = ListBuffer(1, 2, 3, 4, 5, 6)

// 轉換爲不可變列表
scala> a.toList
res23: List[Int] = List(1, 2, 3, 4, 5, 6)

// 轉換爲數組
scala> a.toArray
res24: Array[Int] = Array(1, 2, 3, 4, 5, 6)

列表常用操作

以下是列表常用的操作

	判斷列表是否爲空(isEmpty)
	拼接兩個列表(++)
	獲取列表的首個元素(head)和剩餘部分(tail)
	反轉列表(reverse)
	獲取前綴(take)、獲取後綴(drop)
	扁平化(flaten)
	拉鍊(zip)和拉開(unzip)
	轉換字符串(toString)
	生成字符串(mkString)
	並集(union)
	交集(intersect)
	差集(diff)

判斷列表是否爲空

參考代碼

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> a.isEmpty
res51: Boolean = false

拼接兩個列表

參考代碼

scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)

scala> val b = List(4,5,6)
b: List[Int] = List(4, 5, 6)

scala> a ++ b
res52: List[Int] = List(1, 2, 3, 4, 5, 6)

獲取列表的首個元素和剩餘部分

參考代碼

scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)

scala> a.head
res4: Int = 1

scala> a.tail
res5: List[Int] = List(2, 3)

反轉列表

參考代碼

scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)

scala> a.reverse
res6: List[Int] = List(3, 2, 1)

獲取列表前綴和後綴

參考代碼

scala> val a = List(1,2,3,4,5)
a: List[Int] = List(1, 2, 3, 4, 5)

scala> a.take(3)
res56: List[Int] = List(1, 2, 3)

scala> a.drop(3)
res60: List[Int] = List(4, 5)

扁平化(壓平)

扁平化表示將列表中的列表中的所有元素放到一個列表中。

在這裏插入圖片描述

參考代碼

scala> val a = List(List(1,2), List(3), List(4,5))
a: List[List[Int]] = List(List(1, 2), List(3), List(4, 5))

scala> a.flatten
res0: List[Int] = List(1, 2, 3, 4, 5)

拉鍊與拉開

	拉鍊:使用zip將兩個列表,組合成一個元素爲元組的列表
	拉開:將一個包含元組的列表,解開成包含兩個列表的元組

參考代碼

scala> val a = List("zhangsan", "lisi", "wangwu")
a: List[String] = List(zhangsan, lisi, wangwu)

scala> val b = List(19, 20, 21)
b: List[Int] = List(19, 20, 21)

scala> a.zip(b)
res1: List[(String, Int)] = List((zhangsan,19), (lisi,20), (wangwu,21))

參考代碼

scala> res1.unzip
res2: (List[String], List[Int]) = (List(zhangsan, lisi, wangwu),List(19, 20, 21))

轉換字符串

toString方法可以返回List中的所有元素

參考代碼

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> println(a.toString)
List(1, 2, 3, 4)

生成字符串

mkString方法,可以將元素以分隔符拼接起來。默認沒有分隔符

參考代碼

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> a.mkString
res7: String = 1234

scala> a.mkString(":")
res8: String = 1:2:3:4

並集

union表示對兩個列表取並集,不去重

參考代碼

scala> val a1 = List(1,2,3,4)
a1: List[Int] = List(1, 2, 3, 4)

scala> val a2 = List(3,4,5,6)
a2: List[Int] = List(3, 4, 5, 6)

// 並集操作
scala> a1.union(a2)
res17: List[Int] = List(1, 2, 3, 4, 3, 4, 5, 6)

// 可以調用distinct去重
scala> a1.union(a2).distinct
res18: List[Int] = List(1, 2, 3, 4, 5, 6)

交集

intersect表示對兩個列表取交集
scala> val a1 = List(1,2,3,4)
a1: List[Int] = List(1, 2, 3, 4)

scala> val a2 = List(3,4,5,6)
a2: List[Int] = List(3, 4, 5, 6)

scala> a1.intersect(a2)
res19: List[Int] = List(3, 4)

差集

diff表示對兩個列表取差集,例如: a1.diff(a2),表示獲取a1在a2中不存在的元素
scala> val a1 = List(1,2,3,4)
a1: List[Int] = List(1, 2, 3, 4)

scala> val a2 = List(3,4,5,6)
a2: List[Int] = List(3, 4, 5, 6)

scala> a1.diff(a2)
res24: List[Int] = List(1, 2)

4、Set

Set()是代表沒有重複元素的集合。Set具備以下性質:
1.	元素不重複
2.	不保證插入順序

scala中的集也分爲兩種,一種是不可變集,另一種是可變集。
不可變集

不可變集:

語法

創建一個空的不可變集,語法格式:

val/var 變量名 = Set[類型]()

給定元素來創建一個不可變集,語法格式:

val/var 變量名 = Set(元素1, 元素2, 元素3...)

示例一

定義一個空的不可變集

參考代碼

scala> val a = Set[Int]()
a: scala.collection.immutable.Set[Int] = Set()

示例二

定義一個不可變集,保存以下元素:1,1,3,2,4,8

參考代碼

scala> val a = Set(1,1,3,2,4,8)
a: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 8, 4)

基本操作

	獲取集的大小(size)
	遍歷集(和遍歷數組一致)
	添加一個元素,生成一個Set(+)
	拼接兩個集,生成一個Set(++)
	拼接集和列表,生成一個Set(++

示例

參考代碼

// 創建集
scala> val a = Set(1,1,2,3,4,5)
a: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

// 獲取集的大小
scala> a.size
res0: Int = 5

// 遍歷集
scala> for(i <- a) println(i)

// 刪除一個元素
scala> a - 1
res5: scala.collection.immutable.Set[Int] = Set(5, 2, 3, 4)

// 拼接兩個集
scala> a ++ Set(6,7,8)
res2: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 8, 4)

// 拼接集和列表
scala> a ++ List(6,7,8,9)
res6: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 9, 2, 7, 3, 8, 4)

可變集:

定義

可變集合不可變集的創建方式一致,只不過需要提前導入一個可變集類。
手動導入:import scala.collection.mutable.Set

參考代碼

scala> val a = Set(1,2,3,4)
a: scala.collection.mutable.Set[Int] = Set(1, 2, 3, 4)                          

// 添加元素
scala> a += 5
res25: a.type = Set(1, 5, 2, 3, 4)

// 刪除元素
scala> a -= 1
res26: a.type = Set(5, 2, 3, 4)

5、映射

Map可以稱之爲映射。它是由鍵值對組成的集合。在scala中,Map也分爲不可變Map和可變Map。

不可變Map

語法

 
val/var map = Map(->,->,->...) // 推薦,可讀性更好
val/var map = Map((,), (,), (,), (,)...)

參考代碼

scala> val map = Map("zhangsan"->30, "lisi"->40)
map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 40)

scala> val map = Map(("zhangsan", 30), ("lisi", 30))
map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 30)

// 根據key獲取value
scala> map("zhangsan")
res10: Int = 30

可變Map

定義

定義語法與不可變Map一致。但定義可變Map需要手動導入
import scala.collection.mutable.Map
scala> val map = Map("zhangsan"->30, "lisi"->40)
map: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30)

// 修改value
scala> map("zhangsan") = 20

6、Map基本操作

基本操作

	獲取值(map(key))
	獲取所有key(map.keys)
	獲取所有value(map.values)
	遍歷map集合
	getOrElse
	增加key,value對
	刪除key

示例:

參考代碼

scala> val map = Map("zhangsan"->30, "lisi"->40)
map: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30)

// 獲取zhagnsan的年齡
scala> map("zhangsan")
res10: Int = 30

// 獲取所有的學生姓名
scala> map.keys
res13: Iterable[String] = Set(lisi, zhangsan)

// 獲取所有的學生年齡
scala> map.values
res14: Iterable[Int] = HashMap(40, 30)

// 打印所有的學生姓名和年齡
scala> for((x,y) <- map) println(s"$x $y")
lisi 40
zhangsan 30

// 獲取wangwu的年齡,如果wangwu不存在,則返回-1
scala> map.getOrElse("wangwu", -1)
res17: Int = -1

// 新增一個學生:wangwu, 35
scala> map + "wangwu"->35
res22: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30, wangwu -> 35)

// 將lisi從可變映射中移除
scala> map - "lisi"
res23: scala.collection.mutable.Map[String,Int] = Map(zhangsan -> 30)

好啦 !!! 今天就分享到這裏了 明天繼續給大家分享哦!!!

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