Scala将选项转换为Int

时间:2012-04-17 08:50:58

标签: scala scala-collections

我查看了这些链接

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

如何在一条线上实现这一目标?我需要多次这样做。每次编写函数看起来效率都不高。我确信有一些我缺少的智能一线怪癖,但我真的希望将值变为一行中的整数:)

3 个答案:

答案 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