跳至主要内容

Scala Option

Scala Option: ch6,ch7

  • 避免 NullPointerException
  • Some vs. None 子類
    • Some: 具型別(Type)單元素集合
    • None: 不具型別(Type)單元素集合
  • 集合中有需多操作利用 Option 來避免 NullPointerException
    • headOption
    • find
    • filter

Scala Option 範例


ex1: 有指定型別
var optionContent : String ="content"
var toOption = Option(optionContent)
//Option[String] = Some(content)


ex2: 未有型別
var optionContent = null
var toOption = Option(optionContent)
//Option[Null] = None


headOption : ex3: 集合中內建的 Option 操作
val odds = List(1,3,5)
odds.headOption
// Option[Int] = Some(1)
val even = odds filter( _ %2 == 0)
even.headOption
// Option[Int] =None



find : ex3: 集合中內建的 Option 操作
val words = List("UPPER_CASE", "LOWER_CASE")
val upper = words find (w => w==w.toUpperCase)
//upper: Option[String] = Some(UPPER_CASE)
val lower = words find (w => w==w.toLowerCase)
//lower: Option[String] = None



map: 集合中內建的 Option 操作
ex4:
val filter = words filter( _.endsWith("CASE") ) map (_.toLowerCase)
//List[String] = List(upper_case, lower_case)



//取值 orElse : return Option
如果 Option 為None, 則自動換為指定Option

var optionContent = "default"
var toOption = Option(optionContent)
var result = toOption orElse Option("Replacement")
//Some(Replacement)
var optionContent = null
var toOption = Option(optionContent)
var result = toOption orElse Option("Replacement")
//Some(default)


//取值 getOrElse : return content
如果 Option 為None, 則回傳指定值,
不然取出Option的content

var optionContent = null
var toOption = Option(optionContent)
var result = toOption getOrElse "Replacement"
//result: String = Replacement
var optionContent = "default"
var toOption = Option(optionContent)
var result = toOption getOrElse "Replacement"
//result: String = default


//取值 fold
將元素累進進行指定動作
(?? example 中回傳的不是 Option??)

collection.fold("init")(_ operon _)
1st _ : init 與 第一個 element 進行 operon 操作 的 return
2nd _ : next element
ex:
var words = List("LARGE", "MIDDLE", "SMALL")
val fold1 = words.fold("Size:")(_ + " " + _.toLowerCase)
//res: String = Size: large middle small


//取值 match
ex1: 用來當作 switch case 使用
var content = "content"
var selection = Option(content)

var result1 = selection match {
case Some("content1") => "Found 1";
case Some("content2") => "Found 2";
case None => "Null";
case _ => "Not Found" ;
}

ex: 針對有值的Option , 進一步更改Content
var selection = Option("content")
var result1 = selection match {
case Some(x) => x*2;
case None => "Null";
}