1、 可变集合 -- mutable
(1) ListBuffer
(2) HashMap
(3) HashSet
// 1、创建可变的list集合
val listBuffer = new ListBuffer[String]
// 2、 创建可变的Map集合
val hashMap = new mutable.HashMap[String, String]()
// 3、 创建可变的Set集合
val hashSet = new mutable.HashSet[String]()
(4 (1)java 中的模式匹配 :
可以匹配基本数据类型、字符串、枚举
(2)scala 中的模式匹配 :
可以匹配基本数据类型、字符串、枚举、对象、匹配类型
匹配成功后可以有返回值
(3)格式 :
val i = 100
i match {
//匹配项,只有一个可以匹配成功
case 100 => println("i等于100")
case 200 => println("i等于200")
case _ => println("其它")
}
(4) 应用 : 主要用于高阶函数、匿名函数
1、匹配数组
// 没有使用的列可以使用下划线占位
case Array(id: String, _: String, sco: String) =>
(id, sco.toInt)
2、匹配类型
// 匹配类型 -- 字段的顺序和类型要一致
case (id: String, name: String, age: Int) =>
(id, name, age + 1)
(5) 以后代码尽量使用case,这样使得代码可读性变高
// 3、 按学号分组
val groupSco: Map[String, List[(String, String, Int)]] = kvScore.groupBy {
case (id: String, _: String, _: Int) => id
}
3、 隐式转换 -- implicit 关键字
作用 : 简化代码
(1) 隐式转换方法 :
可以将当前作用域中所有的参数类型的变量转换成返回值类型
隐式转换方法和方法名无关, 和参数类型、返回值类型有关
在同一个作用域中只能存在一个参数类型和返回值类型一样的隐式转换方法
隐式转换的作用 -- 可以动态的给对象增加新的方法
scala中的String 和java中的String是同一个。
为什么scala中的String有toInt ,toDouble?
--因为scala会隐式的将String转换成StringLike
格式:
// 将所有 int类型的变量转换成 String类型
implicit def intToString(i: Int): String = {
println("intToString")
i.toString
}
// 这个100既是Int类型, 也是转换成的String类型
100.split(",")
(2) 隐式转换类 :
可以将构造函数参数类型转换成当前类的类型 -- 构造函数参数类型就会多了当前类的方法
隐式转换类和类名无关,和构造函数的参数类型、隐式转换的方法名有关
格式:
// 参数类型String转换成了Read类的类型, 所以String类型的就有了load方法
implicit class Read(path: String) {
def load: List[String] = {
println("读取数据的方法")
Source.fromFile(path).getLines().toList
}
}
4、(1) 偏应用函数 :
并不是一个函数叫偏应用函数,而是一种应用叫偏应用函数
调用函数时可以不用把参数全传完
val f1: Int => Int = fun(100, _: Int)
(2) 函数柯里化 :
调用函数时可以不用把参数全传完
def fun1(x: Int)(y: Int) = x * y
(3) 函数柯里化一般与隐式转换变量一起使用 :
implicit val num: Int = 100
def fun2(x: Int)(implicit y: Int): Int = x * y
println(fun2(2)) // 2*100 = 200
5、 反射
可以通过类对象获取类的方法、构造函数、属性
可以通过获取到的构造函数创建这个类的对象
类对象 : 一个class文件在内存中的存在形式, 本质是Class这个类的对象(所有的类都是Class类的对象)
类的对象 : 通过new创建的类的对象