Scala语法细节05--double_happy

Case Class


/**
  *   
  * case class 样例类  必须要有参数列表
  * case object 样例对象  必须不能加参数列表
  *
  * interview: class 和 case class的区别
  *
  * case class 重写了toString, equals  hashCode
  * case class 默认就实现了序列化
  * case class 不用new
  */
object CaseClassApp {
  def main(args: Array[String]): Unit = {
    println(Dog("旺财").name)
  }

}

case class Dog(name:String)

测试上面的结论:

class :
	scala> class person(val name :String , val age : Int)
	defined class person
	
	scala> val p1 = new person("sx",24)
	p1: person = person@38f796a5
	
	scala> val p2 = new person("sx",24)
	p2: person = person@1d04ef4f
	
	scala> p1 ==p2
	res37: Boolean = false
case class :
	scala> case class Person(name : String ,age : Int)
	defined class Person

	scala> val p3 = Person("sx",30)
	p3: Person = Person(sx,30)
	
	scala> val p4 = Person("sx",30)
	p4: Person = Person(sx,30)
	
	scala> p3 ==p4
	res38: Boolean = true

这里为什么 case  class 的就相等呢?
	case class 重写了toString, equals  hashCode

模式匹配

**
  *
  * 模式匹配
  * 身高
  * 腿
  * 脸
  * 胸
  *
  *  变量  match {
  *     case 颜值 => code
  *     case 腿  => code
  *     case 身高 => code
  *     case 脸   =>  code
  *     case _  => 凤姐 芙蓉姐姐
  *  }
  *
  * 匹配内容、匹配类型、匹配集合、匹配case
  */
object MatchApp {

  def main(args: Array[String]): Unit = {

    /**
      * 匹配内容
      */

    val teachers = Array("Aoi Sola", "YuiHatano", "Akiho Yoshizawa")
    val name = teachers(Random.nextInt(teachers.length))

    name match {
      case "YuiHatano" => println("波老师")
      case "Akiho Yoshizawa" => println("吉老师")
      case _ => println("真不知道这位老师是谁")
    }

//    println(name)

    /**
      * 类型匹配
      */

    def matchType(obj:Any) = obj match {
      case x:Int => println("Int")
      case s:String => println("String")
      case m:Map[_,_] => println("Map")
      case _ => println("Other Type...")
    }

//    matchType(1)
//    matchType("若泽")
//    matchType(Map("ruoze"->30))
//    matchType(10L)

    /**
      * 匹配集合
      */
    def matchList(list:List[String]): Unit = {
      list match {
        case "ruoze"::Nil => println("Hello: ruoze") // 只能匹配只有若泽一个元素
        case x::y::Nil => println(s"Hi: $x , $y") // 能匹配集合中有两个元素的
        case "jepson"::tail => println("HI:jepson and others") // 匹配jepson开头的
        case _ => println("......")
      }
    }

//    matchList(List("ruoze"))
//    matchList(List("苍老师","泷老师"))
//    matchList(List("jepson","苍老师","泷老师","波老师"))
//    matchList(List("苍老师","泷老师","波老师","jepson"))


    /**
      * case class匹配
      */
    val caseclasses = Array(CheckTimeOutTask,HeartBeat(3000),SubmitTask("100","task100"))

    caseclasses(Random.nextInt(caseclasses.length)) match {
      case CheckTimeOutTask => println("CheckTimeOutTask")
      case HeartBeat(time) => println("HeartBeat")
      case SubmitTask(id,name) => println("SubmitTask")
    }

//涉及到流的方式 
    val file = "xx.txt"
    try{
      //TODO... 业务逻辑处理
      // open file
      1/0
    } catch {
      case e:ArithmeticException => println("除数不能为0...")
      case e:Exception => e.printStackTrace()
    } finally {
      // 资源释放的
      // close
      println("一定会执行....")
    }


  }


}

case class SubmitTask(id:String,name:String)
case class HeartBeat(time:Long)
case object CheckTimeOutTask

柯里化与偏函数

object OtherFunctionApp {

  def main(args: Array[String]): Unit = {
    // currying
    def sum(a:Int,b:Int) = a + b

    //println(sum(3,5))

    // Spark源码  Spark SQL UDF
    def sum2(a:Int)(b:Int) = a + b
    //println(sum2(4)(6))

    /**
      * 偏函数  PartialFunction
      * A: 输入参数类型
      * B:输出参数类型
      *
      * 包在花括号内没有match的一组case语句
      */
    val teachers = Array("Aoi Sola", "YuiHatano", "Akiho Yoshizawa")
    val name = teachers(Random.nextInt(teachers.length))


    def say:PartialFunction[String,String] = {
      case "YuiHatano" => "波老师"
      case "Akiho Yoshizawa" => "吉老师"
      case _ => "真不知道这位老师是谁"
    }

    println(say(name))
  }

}

文件操作

object FileApp {
  def main(args: Array[String]): Unit = {
    val content = Source.fromFile("E:\\ruozedata_workspace\\ruozedata-spark\\data\\file.txt")
//    println(content)

    def read(): Unit ={
      for(line <- content.getLines()){  //
        println(line)
      }
    }
    read()
  }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章