1、apply的工厂作用,用于获取对象。
2、unapply的提取对象参数的作用 ,用于模式匹配。
/**
* apply方法通常称为注入方法,在伴生对象中做一些初始化操作
* apply方法的参数列表不需要和构造器的参数列表统一
* unapply方法通常称为提取方法,使用unapply方法提取固定数量的构造该对象的参数
* unapply方法会返回一个序列(Option),内部产生一个Some对象,Some对象存放一些值
* apply方法和unapply方法会被隐式的调用
* @param name
* @param age
* @param faceValue
*/
class ApplyDemo(val name: String, var age: Int, var faceValue: Int) {
}
object ApplyDemo {
//注入方法
def apply( name:String, age:Int,gender:Int,faceValue:Int): ApplyDemo =
new ApplyDemo(name,age,faceValue)
//提取方法:提取器,它实现了构造器相反的效果,构造器从给定的参数创建一个对象,然而提取器却从对象中提取出构造该对象的参数
def unapply(applyDemo: ApplyDemo): Option[(String, Int, Int)] ={
if(applyDemo ==null){
None
}else{
Some(applyDemo.name,applyDemo.age,applyDemo.faceValue)
}
}
}
object test3{
def main(args: Array[String]): Unit = {
val applyTest=ApplyDemo("ning",23,0,90) //没有用new,调用了ApplyDemo的apply方法了
val list=List(1,2,3)
println(s"applyTest_name: $applyTest.name") //applyTest_name: [email protected]
applyTest match {
//隐式调用了unapply方法,
case ApplyDemo(name,age,faceValue) => println(s"age: $age") //age: 23
case _ =>println("nothing")
}
}
}
3、函数的apply使用。我们该如何调用这个函数呢? 答案是通过FunctionN的 apply 方法。
Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身,
在Scala语言中, 函数也是对象, 每一个对象都是scala.FunctionN(1-22)的实例, 其中N是函数参数的数量, 例如我们定义一个函数并复制给一个变量:
scala> val f = (x: Int) => x + 1
f: Int => Int = <function1>
这里定义了一个接收一个整型变量作为参数的函数, 函数的功能是返回输入参数加1. 可以看到REPL返回参数的toString方法 即 <function0> . 那么如果我们有一个指向函数对象的引用, 我们该如何调用这个函数呢? 答案是通过FunctionN的 apply 方法, 即 FunctionN.apply() , 因此调用函数对象的方法如下:
scala> f.apply(3)
res2: Int = 4
但是如果每次调用方法对象都要通过FunctionN.apply(x, y...), 就会略显啰嗦, Scala提供一种模仿函数调用的格式来调用函数对象
scala> f(3)
res3: Int = 4