Scala提取器基础

apply方法

伴生类和伴生对象的概念,companion class和companion object
伴生对象里面,可以定义一个apply方法
直接调用类(参数),方式,就相当于在调用apply方法
此时在apply方法中,通常来说(也不一定),会创建一个伴生类的对象,返回回去
这种方式,有一个好处,创建对象呢,非常的方便
不要每次都是new 类(参数),类(参数)

提取器

unapply方法

和apply方法,顾名思义,那就是反过来
apply方法,可以理解为,接收一堆参数,然后返回一个对象
unapply方法,可以理解为,接收一个字符串,解析成一个对象的各个字段
提取器就是一个包含了unapply方法的对象,跟apply方法正好相反
apply方法,是接收一堆参数,然后构造出来一个对象
unapply方法,是接收一个字符串,然后解析出对象的属性值

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; 每个field都有一对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中的样例类,默认就是提供apply方法和unapply方法的

case class Person(name: String, age: Int)

val p = Person("leo", 25)

p match {
    case Person(name, age) => println(name + ": " + age)
}

只有一个参数的提取器

如果接收一个字符串,作为参数,然后从字符串里面解析出来多个字段值,然后将多个字段值封装在一个tuple中作为Some类型的对象,返回

现在我们来想一下,如果你的类只有一个字段
字符串里面只有一个字段,解析出来的一个字段,是没有办法放在tuple中的,因为scala中的tuple,规定了,必须要两个以及两个以上的值

这个时候,在提取器,unapply方法中,只能将一个字段值,封装在Some对象中,直接返回

class Person(val name: String)

object Person {
  def unapply(input: String): Option[String] = Some(input)
}

val Person(name) = "leo"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,505评论 1 24
  • 1.1. 什么是Scala Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特...
    文子轩阅读 1,557评论 1 3
  • 提取器 在之前的文章中写过一个非常强大的语言特性: 模式匹配 。 它可以解绑一个给定的数据结构。 这不是 Scal...
    SunnyMore阅读 558评论 0 2
  • 读《快学Scala 》一书的摘要 Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象。 在...
    abel_cao阅读 1,299评论 0 8
  • 查过成绩了,虽然不高,但是没挂,感谢刘老师,感谢各科老师。
    38ecc23b9179阅读 195评论 0 1