scala笔记 隐式转换、模式匹配

Scala中Json类对case class类做转换json字符串操作时,需要对case calss类做隐式转换,转换有代码编译顺序要求,最里层定义的case class优先定义在最上面,先做编译,越靠外层定义在后面。
implicit val userSimpleResponseDTOfmt = Json.format[UserSimpleResponseDTO]
implicit val attributesSimpleDTOfmt = Json.format[AttributesSimpleDTO]
implicit val assetSimpleInfoDTOfmt = Json.format[AssetSimpleInfoDTO]
def getDesignSimpleInfo(aid: String, originuser: Boolean): ServiceResponse[AssetSimpleInfoDTO]
getDesignSimpleInfo(id, originuser) map {
  resp =>
    Ok(Json.toJson(resp))
}




scala做模式匹配时:
--------------------------------------------------------------------------------
AnyRef
是所有引用类型的基类。除了值类型,所有类型都继承自AnyRef 。
AnyVal
AnyVal 所有值类型的基类, 它描述的是值,而不是代表一个对象。 
它包括 9 个 AnyVal 子类型:
scala.Double 
scala.Float 
scala.Long 
scala.Int 
scala.Char 
scala.Short 
scala.Byte 
上面是数字类型。
scala.Unit 和 scala.Boolean 是非数字类型。


如果传入参数为包装类,不确定参数类型使用AnyRef ,
case class Dog(val name:String , val age:Int)
val dog = Dog("hh",3)
pattenrnMatching(dog)
def pattenrnMatching(x:AnyRef)=x match {
  case d@Dog(name,age)=>println(s"name:$d")
  case x:String =>print(s"sssssssssx:$x")
}




如果入参为基本数据类型,不确定参数类型,使用AnyVal,这个时候,如果是包装类调用这个参数,将会报错
pattenrnMatching(12)
def pattenrnMatching(x:AnyVal)=x match {
//  case d@Dog(name,age)=>println(s"name:$d")
  case x:Int =>print(s"sssssssssx:$x")
}


-----------------------------------------------------------------------------------
模式匹配变量绑定,使用@符号做变量绑定($做字符串连接)
val list =List(List(1,2,3,5),List(4,5,6,10,8,9))
def patternMatching1(x:AnyRef)=x match {
  case e1@List(_,e2@List(a,_*))=>println(s"变量e1=$e1,变量e2=$e2,a=$a")
}
//变量e1=List(List(1, 2, 3, 5), List(4, 5, 6, 10, 8, 9)),变量e2=List(4, 5, 6, 10, 8, 9),a=4




scala中使用case  class来做类的声明,可以省去很多代码,比如创建对象不用new ,进行模式匹配时,
使用case Student(name,age)不会报错。创建普通类,需要在伴生对象中手动创建unapply的方法
class Student(val name:String,val age:Int)
object Student{
  def unapply(student: Student): Option[(String, Int)] = {
    if(student!=null) Some(student.name,student.age)
    else None
  }
}
val student =new Student("张三",22)
def patternMatching2(x:AnyRef)=x match {
  case Student(name,age)=>println(s"name:$name")
}
patternMatching2(student)






for循环中的模式匹配
for((language,framework)<-Map("Java"->"Hodoop","scala"->"spark")){
  println(s"language:$language,framework$framework")
}


language:Java,framework:Hodoop
language:scala,framework:spark




模式匹配与样例对象
同时继承同一个类,如果类没有参数可以声明为object类型方便,调用时直接使用类调用,减少代码编译
sealed trait de
case class A(id:String)extends de
case object C extends de
def handleMessage(msg:de)=msg match {
  case A(id)=>s"id:$id"
  case C=>"no msg"
}
val a =A("ssss")
println(handleMessage(a))
println(handleMessage(C))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值