Scala中apply方法与unapply方法的使用

9 篇文章 0 订阅
订阅专栏
apply方法

在一个类的伴生对象中定义apply方法, 在生成这个类的对象时, 就省去了new关键字



unapply方法

可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象,从中提取值
unapply方法一般用于模式匹配, 也就是用于Scala提取器中.



object Scala_apply_unapply {
  def main(args: Array[String]): Unit = {
    // 伴生类
    class Currency(val value: Double, val unit: String) {

    }
    // 伴生对象
    object Currency{

      def apply(value: Double, unit: String): Currency = new Currency(value, unit)

      def unapply(currency: Currency): Option[(Double, String)] = {
        if (currency == null){
          None
        }
        else{
          Some(currency.value, currency.unit)
        }
      }
    }
    // 创建对象
    val currency: Currency = Currency(20.2, "EUR")
    // 模式匹配
    currency match {
      case Currency(x, "EUR") => println("###" + x)
      case _ => println("no match...")
    }    
  }
}

输出为:

###20.2




Scala提取器(Extractor)
提取器是从传递给它的对象中提取出构造该对象的参数。
Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。


案例一:

object Test {
   def main(args: Array[String]) {
      
      println ("Apply 方法 : " + apply("Zara", "gmail.com"));
      println ("Unapply 方法 : " + unapply("Zara@gmail.com"));
      println ("Unapply 方法 : " + unapply("Zara Ali"));

   }
   // 注入方法 (可选)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // 提取方法(必选)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1)) 
      }else{
         None
      }
   }
}

输出为:

Apply 方法 : Zara@gmail.com
Unapply 方法 : Some((Zara,gmail.com))
Unapply 方法 : None

以上对象定义了两个方法: apply 和 unapply 方法。通过 apply 方法我们无需使用 new 操作就可以创建对象。所以你可以通过语句 Test(“Zara”, “gmail.com”) 来构造一个字符串 “Zara@gmail.com”。

unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。实例中我们使用 Unapply 方法从对象中提取用户名和邮件地址的后缀。
实例中 unapply 方法在传入的字符串不是邮箱地址时返回 None.



提取器使用模式匹配
在我们实例化一个类的时,可以带上0个或者多个的参数,编译器在实例化的时会调用 apply 方法。我们可以在类和对象中都定义 apply 方法。

就像我们之前提到过的,unapply 用于提取我们指定查找的值,它与 apply 的操作相反。 当我们在提取器对象中使用 match 语句是,unapply 将自动执行,
代码如下:

object Test {
   def main(args: Array[String]) {
      
      val x = Test(5)
      println(x)

      x match
      {
         // unapply 被调用
         case Test(num) => println(x + " 是 " + num + " 的两倍!")
         case _ => println("无法计算")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

输出为:

10
105 的两倍!



unapply也用于模式匹配中的对象匹配
在这里插入图片描述




参考文章:
https://www.cnblogs.com/cosmos-wong/p/11439069.html#_label7
https://www.runoob.com/scala/scala-extractors.html
https://www.jianshu.com/p/748b09609858

(四)Scalaapply的应用
MaggieTang0622的博客
10-25 706
Scalaapply的应用
scalaapply方法与unapply方法
热门推荐
bitcarmanlee的博客
08-05 1万+
1.apply方法scala类或者对象有一个主要用途的时候,apply方法就是一个很好地语法糖。请看下面一个简单的例子:class Foo(foo: String) { }object Foo { def apply(foo: String) : Foo = { new Foo(foo) } }定义了一个Foo类,并且在这个类,有一个伴生对象Foo,里面定义了a
Scala apply方法和unapply方法
赵昕彧
04-16 560
一、scala的函数和方法scala,有函数和方法之分,使用val定义函数,用def定义方法。它们各有特点。 函数 定义方式:val 函数变量名 = (参数名:参数类型, 参数名:参数类型…) => 函数体 函数是一个对象,在运行时,它是加载到JVM的方法的。 方法 定义方式:def 方法名(参数名:参数类型, 参数名:参数类型) : [return 返回值类型] = { } 参数列表的数据类型不能省略,但是返回值可以省略(编译器自动推断,但是递归方法不能省略返回值类型)。 可以将函.
Scalaapply()方法和unapply()方法使用
LFQ244117370的博客
08-05 411
apply()的使用,apply⽅法⼀般都声明在伴⽣类对象,可以⽤来实例化伴⽣类的对象 unapply()的使用,也被称为提取器 object Hello { def main(args: Array[String]): Unit = { val test0 = new Test02("goudan") val test01 = Test02("goduan") val goudan = new Test02("狗蛋", 19) /.
scalaapply和unapply
beijicy的专栏
02-01 4643
本文讲解scalaapply和unapply使用方法
scala 系列之 12scalaapply 和 unapply 方法
heqingcool的博客
07-09 256
15 apply和unapply方法 apply、unapply方法都被隐式的调用 apply方法: ​ 1)在一个类的伴生对象定义apply方法,在生成这个类的对象时,就省去了new关键字。 ​ 2)apply方法的参数列表不需要和构造函数的参数列表统一,也就是说apply 方法支持重载。 ​ 3)apply 方法可以通过主构造器和辅助构造器new对象; ​ 4)apply方法 定义在object 里,是创建对象;如果定义在class 里,是获取对象的数据; apply方法定义
简述apply方法和unapply方法的调用约定以及通常的应用场景
06-09
apply方法和unapply方法Scala的两个重要方法,常用于模式匹配和元组解构等操作。 apply方法是一个对象的工厂方法用于创建和初始化该对象。在调用对象时,可以省略apply方法的名称,直接使用括号表示调用该...
apply方法和unapply方法的调用约定以及通常的应用场景
06-11
Scalaapply方法和unapply方法是一对伴生对象的成员方法,它们有着特殊的调用约定。 apply方法的调用约定是:当在对象后面接上一对圆括号并传入一些参数时,会自动调用该对象的apply方法,并将传入的参数作为...
(1)Scala有哪些基本数据类型和操作符? (2)Scala里怎样定义一个变量?与Java的变量定义有什么区别? (3)Scala提供哪些控制结构? (4)简述Scala的类型层次结构。 (5)简述apply方法和unapply方法的调用约定以及通常的应用场景。 (6)Scala有哪几种常用的模式匹配用法?
最新发布
06-13
(5) apply方法和unapply方法Scala的两个特殊方法apply方法通常用于创建对象,可以在不使用new关键字的情况下创建对象。unapply方法通常用于提取对象属性,可以将对象的属性解构为元组或其他数据结构。这两个...
scala-apply和unapply方法
David的博客
11-06 677
                 scala-apply和unapply方法+private关键字   一、scala-apply和unapply方法 package day02 /** * 1,apply 方法通常称为注入方法,在伴生对象里做一些初始化操作 * 2,apply 方法的参数列表不需要和构造器的参数统一 * 3,unapply 方法通常称为提取方法使用unap...
scala apply unapply 的用法
u011747152的博客
01-08 335
object test{ def apply(name:String): String ={ s"$name--${Random.nextLong}" } def unapply(arg: String): Option[String] = { val name=arg.split("--").head if(name.nonEmpty) Some(name)
apply 与 unapply 方法
@潇洒哥
10-11 986
apply方法通常称为注入方法,在伴生对象里做一些初始化的操作。 apply方法的参数列表不需要和构造器的参数列表统一。 unapply方法通常称为提取方法使用unapply方法提取固定数量的对象。 unapply方法会返回一个序列(option),内部产生一个Some对象来存放一些值。 apply方法和unapply方法会被隐式调用。 package test /** * ...
scala apply 和unapply方法的作用
xuehuagongzi000的博客
10-28 960
1、apply的工厂作用,用于获取对象。 2、unapply提取对象参数的作用 ,用于模式匹配。 /** * apply方法通常称为注入方法,在伴生对象做一些初始化操作 * apply方法的参数列表不需要和构造器的参数列表统一 * unapply方法通常称为提取方法使用unapply方法提取固定数量的构造该对象的参数 * unapply方法会返回一个序列(Option)...
scalaapply和unapply方法
z1941563559的博客
03-22 435
apply方法 apply方法被称作注入方法,在类的伴生对象做一个初始化操作 apply方法的参数列表不需要跟构造器的参数列表统一 apply方法定义在伴生对象的 当scala类或者对象有一个主要用途的时候,apply方法就是一个很好地语法糖。 apply方法有点类似于java的构造函数,接受构造参数变成一个对象。 unapply方法 那么unapply方法就刚好相反,他是接受一个对象,...
用一个例子告诉你 什么是Scalaapply方法和unapply方法
向热爱自己一样,热爱这个世界。
02-21 622
用一个🌰告诉你 什么是Scalaapply方法和unapply方法
scala 知识总结 apply与unapply
shadowsama的博客
09-30 387
package org.spafka.apply class Foo( val foo: String){ override def toString: String = foo } object Foo{ def apply(foo : String): Foo = {new Foo(foo)} } /** * @author spafka * @modifyer spafka
Scala apply() unapply() update() 方法
我们始终是路人
01-13 593
apply()有如下类和伴生对象class Test {}object Test { def apply(): Test = new Test() def main(args: Array[String]): Unit = { println(Test()) println(Test()) } }程序执行的结果:Test@10dba097 Test@1786f9d5可知,当
Scala apply关键字 不通过new获取实例
做一个好人
09-13 742
1)当不是new关键字来创建对象的时候,使用apply可以使我们的代码更简洁 class Person { var name: String = _ var age:Int = 0 } object Person{ def apply(name:String): Person = { val person = new Person person.n...
apply方法和unapply方法
yanzhelee
09-07 3053
apply方法和unapply方法appply方法通常,在一个类的伴生对象定义apply方法,在生成这个类的对象时,就省去了new关键字。请看下面代码:class Foo(foo:String){}object Foo{ def apply(foo:String) : Foo = { new Foo(foo) } }定义一个Foo类,并且在这个类,有一个伴生对象Foo,里面定义
写文章

热门文章

  • Centos7中yum安装时出现错误[Errno 14] curl#6 - "Could not resolve host: mirrors.aliyuncs.com; Unknown e解决办法 13822
  • 输入HDFS命令报错: Couldn't create proxy provider null 7036
  • Scala中List集合与Map集合的相互转换 6737
  • 如何彻底删除快压广告 5456
  • maven打包java11出现 Fatal error compiling: 错误: 无效的目标发行版:11.0 -> [Help 1]解决办法 4443

分类专栏

  • MySQL
  • Java 5篇
  • 技术 3篇
  • spring boot 1篇
  • css
  • js
  • vue
  • spark 7篇
  • Scala 9篇
  • kafka
  • 大数据 10篇
  • Linux 4篇
  • Hbase 2篇
  • Hive
  • hadoop
  • zookeeper
  • Flume
  • Sqoop
  • storm
  • Echarts 1篇
  • Git 8篇
  • 青春 2篇

最新评论

  • Scala语言之匿名函数以及简化写法来改善代码

    局外人(all is true): 发明这些东西的人,我***

  • Centos7中yum安装时出现错误[Errno 14] curl#6 - "Could not resolve host: mirrors.aliyuncs.com; Unknown e解决办法

    陈大大的期待: nameserver你的和博主的能一样吗,填你自己的ip地址,然后yum clear 然后再重新yum make

  • Centos7中yum安装时出现错误[Errno 14] curl#6 - "Could not resolve host: mirrors.aliyuncs.com; Unknown e解决办法

    王与弓长: 重启还是没用。。

  • Centos7中yum安装时出现错误[Errno 14] curl#6 - "Could not resolve host: mirrors.aliyuncs.com; Unknown e解决办法

    qq_38112915: 这个操作之后如果还是不行的话,需要重启一下网络 service network restart

  • maven打包java11出现 Fatal error compiling: 错误: 无效的目标发行版:11.0 -> [Help 1]解决办法

    _AkstNhmyRwn: 多谢~

最新文章

  • cad基础知识1
  • cad里 from tt tk 区别
  • mybaits第一天学习笔记
2024年1篇
2023年1篇
2021年1篇
2020年17篇
2019年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家佛像玻璃钢雕塑厂家玻璃钢雕塑铁艺苏州定制玻璃钢雕塑天门玻璃钢雕塑小品厂商焦作公园玻璃钢彩绘雕塑制作仿真玻璃钢雕塑制作厂家画画培训玻璃钢雕塑哈尔滨玻璃钢雕塑厂家安徽大型玻璃钢雕塑厂福建环保玻璃钢雕塑制作天津玻璃钢几何雕塑陕西大型玻璃钢雕塑生产厂家甘肃玻璃钢美国队长雕塑七夕气球商场美陈出口玻璃钢艺术雕塑深圳节庆商场美陈多少钱抽象玻璃钢花盆儿海珠玻璃钢卡通雕塑玻璃钢雕塑往哪里好笑玻璃钢雕塑人物设计费用主题商场美陈市场报价马鞍山玻璃钢雕塑厂家电话大型玻璃钢雕塑企业吉祥物雕塑梅州大型玻璃钢雕塑玻璃钢门口迎宾雕塑宣威市玻璃钢雕塑收费柳州玻璃钢景观雕塑河西十一商场美陈户外玻璃钢雕塑电话广东特色商场美陈哪家好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化