<点点滴滴>有关Scala的Option类的使用

时间:2020-12-13 22:26:54
//快学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,什么也不做。