有關Scala的Option類的使用

//快學scala的第四章課後習題第一題
  val prices=Map("xiaomi"->5,"meizu"->10,"huawei"->20)
  //
短短一行代碼就可以把價格打九折返回給一個新的map
  val  disprice=for((k,v)<-prices) yield (k,v*0.9)
  for((k,v)<-disprice)
  {
    println(k+" : "+v)
  }


//快學scala的第四章課後習題第二題
val in=new java.util.Scanner(new File("C:\\Users\\user\\Desktop\\快學Scala 課後習題答案集合\\a.txt"));
val wordcount: Map[String, Int] =new mutable.HashMap[String,Int](); 
  while(in.hasNext){  
var  temp=in.next() 
 //scala 方便的方法讓wordcount短短几行代碼。
  // getOrElse(key,default)獲取key對應的value,如果不存在則返回一個默認值。(這個問題也可以使用Option類解決,見下文)  
   wordcount.put(temp,wordcount.getOrElse(temp,0)+1)
}
 //判斷wordcount裏面是否有key爲“aaa”的元素,沒有的話則添加(“aaa”,20)到wordcount中
  wordcount.getOrElseUpdate("aaa",20)
  
//遍歷輸出map
   for((k,v)<-wordcount)
    {
    println(k+" : "+v)
     }
// map.get返回值是Option[T],這一切都需要從Option說起:
//標準庫中的Option類型用樣例來表示:“那種可能存在,也可能不存在的值”。樣例子類Some包裝了某個值,例如:Some("Tom")
//,而樣例None表示沒有值
//例如:map.get返回值是Option[T]
// 如果map中有key爲iPhone記錄的話則wordcount.get("iPhone")有值,否則wordcount.get("iPhone")爲None
//爲了避免使用None所以引進這個Option類
1:使用match模式匹配:
wordcount.get("iPhone") match {
     case Some(v)=> println(v)
     case None =>println("No Value")
}
   
2:使用isEmpty和get解決 
//  get可以獲取處Option中的值。
  val num=wordcount.get("hadoop")
  if (num.isEmpty) println("No Value") else println(num.get)

如果是map可以使用getOrElse方法 而不必使用上面1,2方法。


同時可以把Option當做是一個要麼爲空,要麼有帶有單個元素的集合,並使用諸如
map,foreach或filter等方法。例如:
wordcount.get("hadoop").foreach(println _)
如果有hadoop則get詞頻次數並打印,否則get返回None,什麼也不做。




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