Scala Trait+Match+Case class+偏函数
trait 特性
- 概念理解
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。 - 举例:trait中带属性带方法实现
注意:
继承的多个trait中如果有同名的方法和属性,必须要在类中使用“override”重新定义。
trait中不可以传参数
package icu.shaoyayu.scala
/**
* @author shaoyayu
* @date 2020/8/1 8:44
* @E_Mail
* @Version 1.0.0
* @readme :
* trait
*/
trait Read{
def read(name:String)={
println(s"$name reading now...")
}
}
trait Write{
def write(name:String)={
println(s"$name writing...")
}
}
/**
* 多继承的时候,第一个使用extends 第二个开始用with连接
*/
class FileAction() extends Read with Write {
}
object Lesson9 {
def main(args: Array[String]): Unit = {
val action = new FileAction()
action.read("张三")
action.write("李四")
}
}
package icu.shaoyayu.scala
/**
* @author shaoyayu
* @date 2020/8/1 9:05
* @E_Mail
* @Version 1.0.0
* @readme :
*/
trait IsEqual{
def isEqual(o:Any):Boolean //可以定义没有实现的方法,有继承的类去实现
def isNoEqual(o:Any):Boolean={ //可以定义实现的方法
!isEqual(o)
}
}
class Circle(x:Int,y:Int,radius:Double) extends IsEqual {
val coordinateX = x;
val coordinateY = y;
val circleRadius = radius;
override def isEqual(o: Any): Boolean = {
o.isInstanceOf[Circle]&&o.asInstanceOf[Circle].coordinateX==this.coordinateX&&o.asInstanceOf[Circle].coordinateY==this.coordinateY&&o.asInstanceOf[Circle].circleRadius==this.circleRadius
}
}
object Lesson10 {
def main(args: Array[String]): Unit = {
val c1 = new Circle(1,2,5)
val c2 = new Circle(1,2,5)
val c3 = new Circle(2,2,5)
println(c1.isEqual(c2)) //true
println(c1.isNoEqual(c2)) //false
println(c1.isEqual(c3)) //false
println(c1.isNoEqual(c3)) //true
}
}
模式匹配match
- 概念理解:
Scala 提供了强大的模式匹配机制,应用也非常广泛。
一个模式匹配包含了一系列备选项,每个都开始于关键字 case。
每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 - 代码及注意点
模式匹配不仅可以匹配值还可以匹配类型
从上到下顺序匹配,如果匹配到则不再往下匹配
都匹配不上时,会匹配到case _ ,相当于default
match 的最外面的”{ }”可以去掉看成一个语句
object Lesson_Match {
def main(args: Array[String]): Unit = {
val tuple = Tuple6(1,2,3f,4,"abc",55d)
val tupleIterator = tuple.productIterator
while(tupleIterator.hasNext){
matchTest(tupleIterator.next())
}
}
/**
* 注意点:
* 1.模式匹配不仅可以匹配值,还可以匹配类型
* 2.模式匹配中,如果匹配到对应的类型或值,就不再继续往下匹配
* 3.模式匹配中,都匹配不上时,会匹配到 case _ ,相当于default
*/
def matchTest(x:Any) ={
x match {
case x:Int=> println("type is Int")
case 1 => println("result is 1")
case 2 => println("result is 2")
case 3=> println("result is 3")
case 4 => println("result is 4")
case x:String => println("type is String")
// case x :Double => println("type is Double")
case _ => println("no match")
}
}
}
偏函数
如果一个方法中没有match 只有case,这个函数可以定义成PartialFunction偏函数。偏函数定义时,不能使用括号传参,默认定义PartialFunction中传入一个值,匹配上了对应的case,返回一个值。
/**
* 一个函数中只有case 没有match ,可以定义成PartailFunction 偏函数
*/
object Lesson_PartialFunction {
def MyTest : PartialFunction[String,String] = {
case "scala" =>{"scala"}
case "hello"=>{"hello"}
case _=> {"no match ..."}
}
def main(args: Array[String]): Unit = {
println(MyTest("scala"))
}
}
样例类(case classes)
- 概念理解
使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。
样例类默认帮你实现了toString,equals,copy和hashCode等方法。
样例类可以new, 也可以不用new - 例子:结合模式匹配的代码
case class Person1(name:String,age:Int)
object Lesson_CaseClass {
def main(args: Array[String]): Unit = {
val p1 = new Person1("zhangsan",10)
val p2 = Person1("lisi",20)
val p3 = Person1("wangwu",30)
val list = List(p1,p2,p3)
list.foreach { x => {
x match {
case Person1("zhangsan",10) => println("zhangsan")
case Person1("lisi",20) => println("lisi")
case _ => println("no match")
}
} }
}
}