8

我看过这些链接

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

我如何在一行中实现这一目标?我需要多次这样做。每次都为此编写一个函数看起来有点低效。我确信我缺少一些智能的单行怪癖,但我真的很喜欢将值转换为单行中的整数:)

4

3 回答 3

18

只需使用 getOrElse 方法:

val count: Int = map.getOrElse(key,0);

另请注意,在 Scala 中,您在名称之后编写类型,而不是之前。

于 2012-04-17T08:56:05.713 回答
6

@om-nom-nom(经典网名)有正确答案,但为了提供另一种方式

val count = map.get(key) fold(0)(num => num)

在知情用户抨击我之前,“Option 没有折叠!”,折叠已添加到Scala 2.10中的 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 fold ;-)

于 2012-04-17T10:17:18.760 回答
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
于 2012-04-17T16:35:42.770 回答