apply方法
伴生類和伴生對(duì)象的概念,companion class和companion object
伴生對(duì)象里面,可以定義一個(gè)apply方法
直接調(diào)用類(參數(shù)),方式,就相當(dāng)于在調(diào)用apply方法
此時(shí)在apply方法中,通常來說(也不一定),會(huì)創(chuàng)建一個(gè)伴生類的對(duì)象,返回回去
這種方式,有一個(gè)好處,創(chuàng)建對(duì)象呢,非常的方便
不要每次都是new 類(參數(shù)),類(參數(shù))
提取器
unapply方法
和apply方法,顧名思義,那就是反過來
apply方法,可以理解為,接收一堆參數(shù),然后返回一個(gè)對(duì)象
unapply方法,可以理解為,接收一個(gè)字符串,解析成一個(gè)對(duì)象的各個(gè)字段
提取器就是一個(gè)包含了unapply方法的對(duì)象,跟apply方法正好相反
apply方法,是接收一堆參數(shù),然后構(gòu)造出來一個(gè)對(duì)象
unapply方法,是接收一個(gè)字符串,然后解析出對(duì)象的屬性值
class Person(val name: String, val age: Int)
object Person {
def apply(name: String, age: Int) = new Person(name, age)
def unapply(str: String) = {
val splitIndex = str.indexOf(" ")
if (splitIndex == -1) None
else Some((str.substring(0, splitIndex), str.substring(splitIndex + 1)))
}
/**
* 輸出:name is leo and age is 25
* @param args
*/
def main(args: Array[String]): Unit = {
val Person(name, age) = "leo 25"
println(s"name is ${name} and age is ${age}")
}
}
樣例類的提取器
scala中的樣例類,說白了,也很簡單
類似于java中的javabean,java中的JavaBean,是什么東東?
包含了一堆屬性,field; 每個(gè)field都有一對(duì)getter和setter方法
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
scala中的樣例類,默認(rèn)就是提供apply方法和unapply方法的
case class Person(name: String, age: Int)
val p = Person("leo", 25)
p match {
case Person(name, age) => println(name + ": " + age)
}
只有一個(gè)參數(shù)的提取器
如果接收一個(gè)字符串,作為參數(shù),然后從字符串里面解析出來多個(gè)字段值,然后將多個(gè)字段值封裝在一個(gè)tuple中作為Some類型的對(duì)象,返回
現(xiàn)在我們來想一下,如果你的類只有一個(gè)字段
字符串里面只有一個(gè)字段,解析出來的一個(gè)字段,是沒有辦法放在tuple中的,因?yàn)閟cala中的tuple,規(guī)定了,必須要兩個(gè)以及兩個(gè)以上的值
這個(gè)時(shí)候,在提取器,unapply方法中,只能將一個(gè)字段值,封裝在Some對(duì)象中,直接返回
class Person(val name: String)
object Person {
def unapply(input: String): Option[String] = Some(input)
}
val Person(name) = "leo"