1函数和方法的区别
方法存在在对象或者类中,运行时加载到JVM的方法区,但是函数本身就是一个对象。运行时加载到JVM堆中。函数在scala编译时回单独产生一个class文件名字functionN(N为参数的个数)。另外使用 _ 可以将方法转为函数
函数定义:
def add(x:Int,y:Int)=x+y
完全体 :val func: (Int, Int) => Int = (x, y) => x + y
2.常见数据结构
2.1数组
2.1.1变长数组
通过指定长度定义数组
val/var 变量名 = new Array[元素类型](数组长度)
用元素直接初始化数组
val/var 变量名 = Array(元素1, 元素2, 元素3...)
2.1.2变长数组
创建变长数组,需要提前导入ArrayBuffer类`import scala.collection.mutable.ArrayBuffer`
创建空的ArrayBuffer变长数组,语法结构:
val/var a = ArrayBuffer[元素类型]()
创建带有初始元素的ArrayBuffer
val/var a = ArrayBuffer(元素1,元素2,元素3....)
val a1 = ArrayBuffer()
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(i<-array) println(i)
2.2元组
val/var 元组 = (元素1, 元素2, 元素3....)
使用箭头来定义元组(元组只能有两个元素)
val/var 元组 = 元素1->元素2
val a = (1, "zhangsan", 20, "beijing")
a: (Int, String, Int, String) = (1,zhangsan,20,beijing)
2.3List
2.3.1不可变列表定义
val/var 变量名 = List(元素1, 元素2, 元素3...)
使用`Nil`创建一个不可变的空列表
val/var 变量名 = Nil
使用`::`方法创建一个不可变列表
val/var 变量名 = 元素1 :: 元素2 :: Nil
val a = List(1,2,3,4)
2.3.2可变列表
先要导入`import scala.collection.mutable.ListBuffer`
val/var 变量名 = ListBuffer[Int]()
使用ListBuffer(元素1, 元素2, 元素3...)创建可变列表,语法结构
val/var 变量名 = ListBuffer(元素1,元素2,元素3...)
val a = ListBuffer[Int]()
a: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
val a = ListBuffer(1,2,3,4)
a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4)
// 导入不可变列表
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)
2.3.3常见方法
以下是列表常用的操作
- 判断列表是否为空(`isEmpty`)
- 拼接两个列表(`++`)
- 获取列表的首个元素(`head`)和剩余部分(`tail`)
- 反转列表(`reverse`)
- 获取前缀(`take`)、获取后缀(`drop`)
- 扁平化(`flaten`)
- 拉链(`zip`)和拉开(`unzip`)
- 转换字符串(`toString`)
- 生成字符串(`mkString`)
- 并集(`union`)
- 交集(`intersect`)
- 差集(`diff`)
2.4Set
2.4.1不可变集
创建一个空的不可变集,语法格式:
val/var 变量名 = Set[类型]()
val a = Set[Int]()
基本操作
- 获取集的大小(`size`)
- 遍历集(`和遍历数组一致`)
- 添加一个元素,生成一个Set(`+`)
- 拼接两个集,生成一个Set(`++`)
- 拼接集和列表,生成一个Set(`++`)
2.4.2可变集
val a = Set(1,2,3,4)
a: scala.collection.mutable.Set[Int] = Set(1, 2, 3, 4)
可变集合不可变集的创建方式一致,只不过需要提前导入一个可变集类。
手动导入:`import scala.collection.mutable.Set`
2.5Map
2.5.1不可变Map
val/var map = Map(键->值, 键->值, 键->值...) // 推荐,可读性更好
val map = Map("zhangsan"->30, "lisi"->40)
map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 40)
val map = Map(("zhangsan", 30), ("lisi", 30))
map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 30)
// 根据key获取value
map("zhangsan")
2.5.2可变Map
定义语法与不可变Map一致。但定义可变Map需要手动导入`import scala.collection.mutable.Map`
val map = Map("zhangsan"->30, "lisi"->40)
map: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30)
// 修改value
map("zhangsan") = 20
基本操作
- 获取值(`map(key)`)
- 获取所有key(`map.keys`)
- 获取所有value(`map.values`)
- 遍历map集合
- getOrElse 获取key的value,如果key不存在,则返回-1
- 增加key,value对 map + ("wangwu"->35) 多个 map + (("ppp", 10), ("iii", 9))
- 删除key map - "lisi"