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

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