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))
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))