我查看了这些链接
http://blog.danielwellman.com/2008/03/using-scalas-op.html
http://blog.tmorris.net/scalaoption-cheat-sheet/
我有[String,Integer]的地图,当我做map.get(“X”)时,我得到了一个选项。我想要以下内容。
val Int count = map.get(key);
// If the key is there I would like value if it is not I want 0
如何在一条线上实现这一目标?我需要多次这样做。每次编写函数看起来效率都不高。我确信有一些我缺少的智能一线怪癖,但我真的希望将值变为一行中的整数:)
答案 0 :(得分:16)
只需使用getOrElse方法:
val count: Int = map.getOrElse(key,0);
另请注意,在Scala中,您在名称之后输入,而不是之前。
答案 1 :(得分:5)
@ om-nom-nom(经典屏幕名称)有正确的答案,但为了提供另一种方式™
val count = map.get(key) fold(0)(num => num)
在知情用户抨击我之前,“选项没有弃牌!”, Scala 2.10中的fold has been added to Option
在当前情况下,getOrElse当然更好,但在某些Some / None场景中,对于带有折叠的1-liner可能很有趣(编辑了@Debiliski的补充,他们测试了最新的2.10快照):
val count = map.get(k).fold(0)(dao.userlog.count(_))
我想在2.9.2中我们可以做到:
val count = map get(k) map ( dao.userlog.count(_) ) getOrElse(0)
也就是说,在Scala中,通常有多种方法可以做同样的事情:在链接线程中,OP显示了超过10种实现Option折叠的替代方法; - )
答案 2 :(得分:3)
又一种方式。
import scalaz._, Scalaz._
scala> val m = Map(9 -> 33)
m: scala.collection.immutable.Map[Int,Int] = Map(9 -> 33)
scala> m.get(9).orZero
res3: Int = 33
scala> m.get(8).orZero
res4: Int = 0