首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么case类的`unapply`方法的实现会有一个`null`检查?

case类的unapply方法的实现会有一个null检查的原因是为了确保在模式匹配时不会出现空指针异常。

在Scala中,case类的主要目的是用于模式匹配。模式匹配是一种强大的语法特性,通过与模式进行匹配,可以提取出case类实例中的属性值。这个过程是通过调用case类的unapply方法来实现的。

unapply方法是case类的伴生对象中的一个特殊方法,用于将一个case类的实例分解为其属性值。在默认情况下,unapply方法会生成一个返回Option类型的函数。如果传入的参数为null,则该函数会返回None,避免出现空指针异常。

这个null检查是为了处理可能的空值情况。由于Scala是基于Java的,Java中存在空指针异常的问题。为了保证代码的健壮性,Scala引入了对空值的处理,其中Option类型就是用于表示可能为空的值。通过在unapply方法中进行null检查,可以确保在模式匹配时不会出现空指针异常。

总结:case类的unapply方法实现中有一个null检查,是为了避免空指针异常,确保在模式匹配时的代码健壮性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

(s"time=$time")     case CheckTimeOutTask => println("检查超时") } 那是不是所有的都可以进行这样模式匹配呢?...答案是不可以。要支持模式匹配,必须要实现一个提取器。 定义提取器 之前我们学习过了,实现一个伴生对象中apply方法,可以用名来快速构建一个对象。伴生对象中,还有一个unapply方法。...与apply相反,unapply是将该类对象,拆解为一个元素。 要实现一个提取器,只需要在该类伴生对象中实现一个unapply方法即可。...示例:实现一个解构器,并使用match表达式进行模式匹配,提取字段。...apply、unapply方法(可以使用scalap反编译一个样例字节码)

35260

Scala 高阶(九):Scala中模式匹配

unapply def unapply(student: Student): Option[(String, Int)] = { if (student == null){ None...Student("alice", 15) => "alice, 20",会默认调用 unapply 方法(对象提取器),student 作为 unapply 方法参数,unapply 方法将 student...样例仍然是,和普通相比,只是其自动生成了伴生对象,并且伴生对象中自动提供了一些常用方法,如 apply、unapply、toString、equals、hashCode 和 copy。...样例是为模式匹配而优化,因为其默认提供了 unapply 方法,因此,样例可以直接使用模式匹配,而无需自己实现 unapply 方法。...例如该偏函数输入类型为List[Int],、需要是第一个元素是 0 集合,这就是通过模式匹配实现

1.5K30
  • scala快速入门系列【提取器】

    答案是: 不可以 要想支持模式匹配,必须要实现一个提取器 [NOTE] 样例自动实现了apply、unapply方法 定义提取器 之前我们学习过了,实现一个伴生对象中...apply方法,可以用名来快速构建一个对象。...伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类对象,拆解为一个元素。 ? ?...要实现一个提取器,只需要在该类伴生对象中实现一个unapply方法即可。 语法格式 ?...示例 创建一个Student,包含姓名年龄两个字段 实现一个解构器,并使用match表达式进行模式匹配,提取字段 参数代码 /** * 通过实现提取器,让普通(非样例)能够支持模式匹配

    30720

    Scala语言快速了解一下?

    Nullnull引用对象类型,它是每个引用(继承自AnyRef子类。Null不兼容值类型。变量在 Scala 中,使用关键词 "var" 声明变量,使用关键词 "val" 声明常量。...与接口不同是,它还可以定义属性和方法实现。一般情况下Scala只能够继承单一父,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。...子类继承特征可以实现未被实现方法。所以其实 Scala Trait(特征)更像 Java 抽象。...Scala 提取器是一个带有unapply方法对象。unapply方法算是apply方法反向操作:unapply接受一个对象,然后从对象中提取值,提取值通常是用来构造该对象值。...unapply方法算是apply方法反向操作:unapply接受一个对象,然后从对象中提取值,提取值通常是用来构造该对象值。

    3K102

    Scala 提取器(Extractor)

    提取器是从传递给它对象中提取出构造该对象参数。 Scala 标准库包含了一些预定义提取器,我们会大致了解一下它们。 Scala 提取器是一个带有unapply方法对象。...unapply方法算是apply方法反向操作:unapply接受一个对象,然后从对象中提取值,提取值通常是用来构造该对象值。...unapply方法算是apply方法反向操作:unapply接受一个对象,然后从对象中提取值,提取值通常是用来构造该对象值。...在我们实例化一个时,可以带上0个或者多个参数,编译器在实例化时会调用 apply 方法。...我们可以在和对象中都定义 apply 方法。 就像我们之前提到过unapply 用于提取我们指定查找值,它与 apply 操作相反。

    92920

    一个实现多个接口同名方法会报错吗?

    这样有问题吗Collection接口中有个size()方法, List接口中也有一个size()方法....大家纠结点应该是在于, 对于接口A, 如果抽象B实现了接口,那么子类C在实现接口时,还要不要重写方法 接口Greet /** * @author lixiang * @date 2020/6/...,要不要去重写方法都不会报错但是通用来说, 抽象作用就是,要有一个通用实现,所以一般来说,还是实现方法比较好, 然后再抛一个抽象具体实现, 如下所示: /** * @author lixiang...Greet接口,但是因为AbstractGreet 已经实现过了接口,所以这里就不用再实现接口cheer方法, 只需要实现抽象doCheer()方法就可以了,当然也可以实现 @Override...这里还有一个比较有趣现象,就是在idea中, 要重写方法时, 提示是覆写抽象,而不是接口,如下图所示: 报错场景 上面都是正确,其实有一种报错场景要注意, 就是当两个不同接口定义方法签名不一致时候

    1.2K20

    Scala:样例、模式匹配、Option、偏函数、泛型(三)

    当我们定义一个样例,编译器自动帮助我们实现了以下几个有用方法: apply方法 toString方法 equals方法 hashCode方法 copy方法 1.4.1 apply方法 apply方法可以让我们快速地使用名来创建对象...样例自动实现了hashCode方法,如果所有成员变量值相同,则hash值相同,只要有一个不一样,则hash值不一样。...ForDemo.main(ForDemo.scala) scala不需要在方法上声明要抛出异常,它已经解决了再Java中被认为是设计失败检查型异常。...NOTE] 样例自动实现了apply、unapply方法 8.1 定义提取器 之前我们学习过了,实现一个伴生对象中apply方法,可以用名来快速构建一个对象。...伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类对象,拆解为一个元素。 要实现一个提取器,只需要在该类伴生对象中实现一个unapply方法即可。

    2.3K20

    03.Scala:样例、模式匹配、Option、偏函数、泛型

    当我们定义一个样例,编译器自动帮助我们实现了以下几个有用方法: apply方法 toString方法 equals方法 hashCode方法 copy方法 1.4.1 apply方法 apply方法可以让我们快速地使用名来创建对象...样例自动实现了hashCode方法,如果所有成员变量值相同,则hash值相同,只要有一个不一样,则hash值不一样。...NOTE] 样例自动实现了apply、unapply方法 8.1 定义提取器 之前我们学习过了,实现一个伴生对象中apply方法,可以用名来快速构建一个对象。...伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类对象,拆解为一个元素。...,只需要在该类伴生对象中实现一个unapply方法即可。

    2.1K20

    3小时Scala入门

    以及 Unit(表示无值与C语言void等同,用作无返回值方法返回类型), Null(AnyRef子类,null是它唯一对象), Nothing(所有类型子类,它没有对象), Any(所有其他...case本来设计用来进行模式匹配,自带apply和unapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面和普通没有什么区别。 1,java风格 ? ? ?...二十五,apply,unapply和update 当把对一个对象当做函数使用时,会自动调用它apply方法。...实践中我们一般用apply方法来构造对象,而无需用new声明一个对象,从而相当于一个语法糖。 unapply方法是apply方法方法,我们一般用它来从对象中反推得到其构造参数。...unapply方法通常在模式匹配中会自动被使用。 case内部实现了apply方法unapply方法。 当把一个对象当做容器取其某个元素赋值时,会自动调用它update方法

    1.6K30

    3小时Scala入门

    以及 Unit(表示无值与C语言void等同,用作无返回值方法返回类型), Null(AnyRef子类,null是它唯一对象), Nothing(所有类型子类,它没有对象), Any(所有其他...case本来设计用来进行模式匹配,自带apply和unapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面和普通没有什么区别。 1,java风格 ? ? ?...二十五,apply,unapply和update 当把对一个对象当做函数使用时,会自动调用它apply方法。...实践中我们一般用apply方法来构造对象,而无需用new声明一个对象,从而相当于一个语法糖。 unapply方法是apply方法方法,我们一般用它来从对象中反推得到其构造参数。...unapply方法通常在模式匹配中会自动被使用。 case内部实现了apply方法unapply方法。 当把一个对象当做容器取其某个元素赋值时,会自动调用它update方法

    1.6K30

    Scala学习笔记(八)

    模式匹配和Case Class Case Class在Scala学习笔记(四) 初步中有提到。 3.1构造器模式匹配 case 后面的值是构造器。...如果在中声明了与该类相同名字 object 则该object 是该类“伴生对象”。伴生对象有一个apply()用于构造对象,跟apply()对偶unapply()用于提取和“解构”。...上面例子匹配,就是用了Person.unapply(...)。 Personcase class,创建时就帮我们实现一个伴生对象,这个伴生对象里定义了apply()和unapply()。...比如"(S|s)cala".r有一个unapply()方法,它返回Option[String]。...既然是一个集合,那么可以对它使用map、foreach或者filter等方法。 总结 模式匹配是 Scala 区别于 Java 重要特征。

    1.1K30

    Scala专题系列 (八) : 模式匹配

    scala中所有,表示任意类型), 注意看函数体 x = match{ case 1 => "one" } 这个就是scala中模式匹配语法结构, 首先变量.match(选择器) 后面跟着一个花括号...case class Person(name : String,age : Int) // 定义一个样板,下面会有样板具体介绍. object Demo{ def main(args:Array...,但是并不推荐这么做; 在伴生对象中提供了apply方法,所以可以不使用new关键字就可构建对象; 提供unapply方法使模式匹配可以工作; 生成toString、equals、hashCode和copy...构造器模式:提供了深度匹配(deep match),如果备选项是样本类,那么构造器模式首先检查对象是否为该备选项样本类实例,然后检查对象构造器参数是否符合额外提供模式。...例如,java.util.HashMapget方法返回存储在HashMap中值,如果没有找到值,则返回null。 假设我们有一种基于主键从数据库中检索记录方法

    85320

    3小时Scala入门

    以及 Unit(表示无值与C语言void等同,用作无返回值方法返回类型), Null(AnyRef子类,null是它唯一对象), Nothing(所有类型子类,它没有对象), Any(所有其他...case本来设计用来进行模式匹配,自带apply和unapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面和普通没有什么区别。 1,java风格 ? ? ?...二十五,apply,unapply和update 当把对一个对象当做函数使用时,会自动调用它apply方法。...实践中我们一般用apply方法来构造对象,而无需用new声明一个对象,从而相当于一个语法糖。 unapply方法是apply方法方法,我们一般用它来从对象中反推得到其构造参数。...unapply方法通常在模式匹配中会自动被使用。 case内部实现了apply方法unapply方法。 当把一个对象当做容器取其某个元素赋值时,会自动调用它update方法

    3.5K20

    Scala 学习笔记之提取器

    提取器 所谓提取器就是一个带有 unapply 方法对象.可以把 unapply 方法理解为伴生对象中 apply 方法反向操作. apply 方法接受构造参数,然后将他们变成对象.而 unapply...方法接受一个对象,然后从中提取值(通常这些值就是当初用来构造该对象值)....例如上面例子中 Fraction , apply 方法从分子和分母创建出一个分数,而 unapply 方法则是去取出分子和分母: (1) 可以在变量定义时使用: // a b 分别被初始化成运算结果分子和分母...通常而言,模式匹配可能会失败,因此 unapply 方法返回一个Option.它包含一个元组,每个匹配到变量各有一个值与之对应.下面中返回一个 Option[(Int, Int)] class...带单个参数或无参数提取器 在Scala中,并没有只带一个组件元组.如果 unapply 方法要提取单值,则应该返回一个目标类型 Option: object Number { def unapply

    58110

    (3) - Scala case class那些你不知道知识

    你可能知道知识 当你声明了一个 case class,Scala 编译器为你做了这些: 创建 case class 和它伴生 object 实现了 apply 方法让你不需要通过 new 来创建实例...unapply 方法一个 case class 支持模式匹配 scala> case class A( a: Int ) defined class A scala> case class B(...case class 没有参数时候,你是在使用 case object 而不是一个空参数列表 case class scala> classMath( A ) A(100) 除了在模式匹配中使用之外...,unapply 方法可以让你结构 case class 来提取它字段,如: scala> val Person(lastname, _, _) = p lastname: String = Lacava...---- 你可能不知道知识 获取一个函数接收一个 tuple 作为参数,该 tuple 元素类型与个数与某 case class 相同,那么可以将该 tuple 作为 case class

    40210

    Scala

    例如,在 Scala 中,我们可以通过隐式转换来实现类型自动转换,将一个字符串转换成整数,将一个整数转换成浮点数,等等。   隐式转换具体实现方式是通过定义隐式转换函数或者隐式实现。...,它有一个名为 name 属性和一个名为 hello 方法。...特质中未被实现方法默认就是抽象⼦子类实现或继承统一使⽤用事extends关键字,如果需要实现或继承多个使⽤用with关键字特质中可以有构造器特质可以继承普通,并且这个称为所有继承trait...一个伴生对象(包含apply和unapply方法)。   ...为了成为一个提取器,unapply⽅法需要被伴生对象。   apply⽅法是为了自动实现样本类对象,⽆需new关键字。

    18830

    大数据利器--Scala语言学习(高级)

    ) 当将 Square(n) 写在 case 后时[case Square(n) => xxx],会默认调用 unapply 方法(对象提取器) 3) number 会被 传递给 def unapply...(z: Double) z 形参 4) 如果返回是 Some 集合,则 unapply 提取器返回结果会返回给 n 这个形参 5) case 中对象 unapply 方法(提取器)返回 some...2) 样例case 关键字进行声明。 3) 样例是为模式匹配(对象)而优化。 4) 构造器中一个参数都成为 val——除非它被显式地声明为 var(不建议这样做)。...5) 在样例对应伴生对象中提供 apply 方法让你不用 new 关键字就能构造出相应对象。 6) 提供 unapply 方法让模式匹配可以工作。...偏函数在 Scala 中是一个特质 PartialFunction 1) 使用构建特质实现(使用方式是 PartialFunction 匿名子类) 2) PartialFunction

    2K10
    领券