Any: Any是所有类型的超类,也称为顶级类型。它定义了个别通用的方法 equals、hashcode和toString。Any有两个子类 AnyVal、AnyRef
AnyValue:AnyVal是值类型,有9个预定义的非空的值类型,如下图所示。其中Unit类似于java中的 void 是不带任何意义的值类型。他仅有一个实例可以是(),所有的类型都必须有返回值类型。Unit也是有返回值类型的一般最后一行代码是返回的类型值。(println是(),Unit类型)
AnyRef:AnyRef是引用类型,除了值类型以外的所有对象都是引用类型,在Scala中每个自定义的类型都是AnyRef的子类型。如果Scala被应用在java中,AnyRef就是java中的超类。相当于java.lang.Object
Nothing:Nothing是所有类型的子类型,称为底部类型。没有一个值是Nothing类型。他的用途之一就是给出终止性的信号 如:抛出异常、程序退出或者是无限循环。
Null:Null是所有引用类型的子类型,。他有一个关键字null所定义,Null主要是让Scala于其他jvm的语言的操作互通性。 几乎不会在Scala中使用。后面会有null的替代方案。
先普及一下小概念吧! 匿名函数是一个 没有函数名的函数并且它的语法是 参数列名=>函数体 :匿名函数中有23个函数内置对象。 Function0-Function22 ,匿名函数的背后对应的是函数对象val f1:Function2【Int,Int,String】=(a:Int,b:Int)=>a+b+" "
object Function06 {
def main(args: Array[String]): Unit = {
// 匿名函数声明
val f2: Function2[Int, Int, String] = (x: Int, y: Int) => x + y + " "
// 匿名函数使用
println(f2(1, 2))
println("-------------------------------------")
val f1: Function1[Int, Unit] = (n: Int) => println(n)
val list = List(1, 2, 3, 4, 5)
// 将函数对象作为方法的参数
list.foreach(f1)
println("-------------------------------------")
list
.filter((n: Int) => n != 3) // 保留集合中符合条件的数据
.foreach((n: Int) => println(n)) // 1 2 4 5
}
}
隐式转换函数指的是以implicit关键字声明的带有单个参数的函数
概念:一种类型转换为另一种类型。
通常命名为 one2other,在伴生对象中书写。
如果需要隐式转换,必须对隐式转换函数进行导入(import)
常用的使用方式:隐式值、隐式参数、隐式函数、隐式增强、隐式类
1、当表达式与预期类型不同时。【隐式值的应用】
2、当对象访问一个不存在的类型时【隐式增强】
3、当对象调用某个方法,而这个方法的参数声明与传入参数不匹配时【隐式函数】
1、代码在不使用隐式转换可以痛殴过编译时,可不使用隐式转化。
2、编译器不会尝试执行多个转换。【String-----》Person】
3、存在二义性的转换是错误的。【同一个类中不能有两个同类型的隐式转换】
语法:
隐式值:implicit val aa:Int=1
隐式参数:def hello(implicit aa;int,bb:String) 这个两个Int值也是可一个,只要隐式值是一个即可。
def hello1(Implicit aa:Int)
def hello2(aa:Int)(implicit bb:Int)
注意:在使用隐式关键字的时候开头和末尾,之后不可以在添加参数
隐式函数:implicit def str2person(str:String)={} 一种类型转换为另一种类型。当调用方法传参方式不同时使用。
隐式增强:与隐式函数差不多 implicit def aa2person(aa:heihei)={
new Person(aa.name)
} 也是把该类中没有的方法转到其他类中。
隐式类:不能单独自定义以个类,需要定义在对象中的隐式类。
主构造器接收一个类型 转换为隐式类型。(Man=====>Person)
一种特殊的数据类型,可以存放任意数据,类似于ArrayList[Object]
Scala中内置类22个元组 Tuple1-Tuple22
一般Tuple2是用于存储map集合的
// 声明
scala> ("zs",1)
res18: (String, Int) = (zs,1)
scala> res18.getClass
res19: Class[_ <: (String, Int)] = class scala.Tuple2
scala> ("zs",1,false)
res20: (String, Int, Boolean) = (zs,1,false)
scala> res20.getClass
res21: Class[_ <: (String, Int, Boolean)] = class scala.Tuple3
// 获取元组中的值 语法: 元组引用名._n 获取元组中第n个值
scala> res20._1
res22: String = zs
scala> res20._2
res23: Int = 1
// 元组的遍历
scala> res20.productIterator
res24: Iterator[Any] = non-empty iterator
scala> for(n <- res24) println(n)
zs
1
false
20._2
res23: Int = 1
// 元组的遍历
scala> res20.productIterator
res24: Iterator[Any] = non-empty iterator
scala> for(n <- res24) println(n)
zs
1
false