有什么作用
apply和unapply 属于Scala的一种语法糖,在class的伴生对象里面定义,apply方法的主要作用可以像调用方法一样创建对象,而unapply方法主要作用是和match一起使用,示例代码如下:
class User(val name: String, val age: Int) {}
object User {
def apply(name: String, age: Int): User = new User(name, age)
def unapply(arg: User): Option[(String, Int)] = {
if (arg == null)
None
else Some(arg.name, arg.age)
}
def main(args: Array[String]): Unit = {
//通过apply方法创建user
val user = User("luolei", 22)
//将user进行匹配,匹配过程中会调用unapply方法
user match {
case User(name, age) => println(name, age)
case _ => None
}
}
}
apply
apply 方法类似于java的构造函数,创建对象的时候自动调用,但是不需要写new关键字
class User(val name: String, val age: Int) {}
object User {
def apply(name: String, age: Int): User = new User(name, age)
def apply(name:String):User = new User(name,3)
def main(args: Array[String]): Unit = {
val user = User("luolei", 22)
val user2= User("luolei")
}
}
apply对象一般写在class的伴生对象当中当然也可以写在class当中,当我们使用类名加括号的时候调用的是伴生对象的apply方法,而使用对象加括号的时候调用的是class的apply方法,通过以下程序和输出
class User(val name: String, val age: Int) {
def apply(name: String, age: Int): User ={
println(s"apply in class name:$name age:$age")
new User(name, age)
}
}
object User {
def apply(name: String, age: Int): User = {
println(s"apply in object name:$name age:$age")
new User(name, age)
}
def main(args: Array[String]): Unit = {
val user = User("luolei", 22)
user("nanan",20)
}
}
输出:
apply in object name:luolei age:22
apply in class name:nanan age:20
这里我们再接着对Array类分析对apply方法加深印象,我们在创建Array时会通过以下两种方式去创建
def main(args: Array[String]): Unit = {
//通过调用Array的apply方法
val arr = Array(1,2,3,4,5)
//通过创建对象在添加数据
val arr2 = new Array[Int](3)
arr2(0) = 1
arr2(1) = 2
arr2(2) = 3
}
这里我们可以看Array源码 ,在下图可以看到Array里面对apply方法进行了很多重载,从中选一个apply方法代码进行查看,可以看到如何不使用new创建一个Array的
/** Creates an array of `Long` objects */
// Subject to a compiler optimization in Cleanup, see above.
def apply(x: Long, xs: Long*): Array[Long] = {
val array = new Array[Long](xs.length + 1)
array(0) = x
var i = 1
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
unapply
unapply相当于apply的逆过程,对数据进行解析,主要作用是和match一起使用