一、Object和Class的区别
1.1 存放的数据不同
同名的Object和class互为半生关系。同名的object是class的半生对象,class是object的半生类。所以一个scala的文件存放同名的Object和Class,Object存放的内容就是像Java中的静态属性和静态方法,Class的是要new一个出来才能使用,所以Object是静态方法和属性的集合,class是一个对象的属性和方法的集合。
object ApplyApp {
println("Hello object enter")
def sayHello: Unit ={
println("object say Hello")
}
println("Hello object exit")
}
class ApplyApp{
println("Hello class enter")
def sayHello: Unit ={
println("class say Hello")
}
println("Hello class exit")
}
ApplyApp.sayHello
结果
Hello object enter
Hello object exit
object say Hello
val a = new ApplyApp()
a.sayHello
结果
Hello class enter
Hello class exit
class say Hello
1.2 两个钟特殊的方法
在Scala中有一个特殊的方法,这个方法名叫做apply
定义:
object ApplyApp {
def apply: ApplyApp ={
println("hi this is apply")
new ApplyApp()
}
}
使用:
var a = ApplyApp()
输出:
hi this is apply
所以结论就是,半生对象(object)没有new,就是调用半生对象中的apply方法。这个是半生对象object,如果是对象呢?
定义:
class ApplyApp{
def apply() = {
println("hi this is class apply")
}
}
调用:
val a = new ApplyApp()
a()
输出:
hi this is class apply
所以结论就是,半生对象(object)(),就是调用半生对象中的apply方法;如果是对象(),就是调用对象中的apply方法,当然不止(),里面可以带参数。
二、数组(Array)
数组和Java一样分为定长数组和变长数组。定长数组定义“val a = new Array[String](5)”;变长数组定义“val a = new ArrayBufferInt ”
2.1 定长数组
常用的定义方式其实不是正规的定义方式(上面定义这种),其实常用的是这种“val b= Array(“aaa”,”bbbb”)”,根据第一节的介绍,可见底层使用的是半生对象(object)的apply方法。
如何取值呢,和Java中不太一样,使用:b(0) =”saf”
常用的方法:
方法 | 含义 | 使用 |
---|---|---|
length | 数组内元素的个数 | b.length |
max | 数组内元素中最大的那个数 | b.max |
sum | 数组内元素的和 | b.sum |
min | 数组内元素中最小的哪个数 | b.min |
mkString | 数组内元素转成一个字符串 | b.mkString每个元素拼接在一个字符串 b.mkString(“,”)每个元素拼接在一个字符串并以”,”分隔 b.mkString(“[“,”,”,”]”)每个元素拼接在一个字符串并以”,”分隔,前后用“[”“]” |
2.1 变长数组
变长数组就是说数组的容量是可以变化的。和定长一样,也不太常用new,所以推荐写法val a = ArrayBufferInt
如何向可变数组中添加数据:
a += 1
a += (2,3,4)
a ++= Arry(5,6,7) //变长加上定长用++=
a.Insert(7, 0,0,0) //向第2个位置中加入3个0
a.remove(1,3) //从第2个位置删除连续三个数
三、Case Class
Case Class是可以不用new就可以生成对象的。
定义
case class Dog(name:String)
使用
plantln(Dog("wangwang").name)
case class的使用场景:1、不用new 直接使用;2、模式匹配使用
注意一下
定义:
object ApplyApp {
def apply(age:String): Unit ={
println("object")
}
}
case class ApplyApp(name:String){
def apply(age:String) = {
println("hi this is class apply")
}
}
调用:
println(ApplyApp("s").name) 报错,不识别name
虽然case class不用new就可以使用对象,但是如果半生对象(object)中用对应形参的apply,优先匹配半生对象???
四、trait
trait就把他看成Java中的接口,只有定义,没有具体实现。
object ApplyApp extends Longging with Serializable {
}
实现的方法:继承第一使用extends,后面的使用with。
五、List集合
Scala中有一个特殊的东西 => Nil,什么是Nil,Nil就是一个空的List。List也分为定长和变长,变长叫做ListBuffer,添加数据的方法和Array一样。
方法 | 含义 | 使用 |
---|---|---|
head | 数组内第一个元素 | b.head |
tail | 数组除了第一个元素的其他元素 | b.tail |
:: | 将::前后数据放置在一个list中,按照原顺序 | 1 :: List(2,3) |
六、Map
创建方式:val a = Map(“key1”->”value”,”key2”->”value”),在键和值之间使用->方式成对。如何取值a(“key1”)。但是有个问题,这个是不可变得Map,a(“key1”)=”hahaha”会报错。一般使用可变的Map,叫做HashMap。添加方式如List差不多。
这种取值的方式有些问题,一旦没有该key,就会报错。常常使用a.getOrElse(“a”,”100”),如果有键,就是该值,如果没键就是这个后面的默认值。
取值方式
1、for((key,value) <- a)
2、for(key <- a.keySet) {key +" " +a(key)}
3、for((key,_) <- a){ key +" " +a(key) }