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