scala apply 和unapply方法的作用

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
发布了159 篇原创文章 · 获赞 75 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/xuehuagongzi000/article/details/102786332