Scala将选项转换为Int

Kan*_*ath 5 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
Run Code Online (Sandbox Code Playgroud)

我如何在一条线上实现这一目标?我需要多次这样做.每次编写函数看起来效率都不高.我确信有一些智能的一线怪癖我错过但我真的想把这个值变成一行中的整数:)

om-*_*nom 16

只需使用getOrElse方法:

val count: Int = map.getOrElse(key,0);
Run Code Online (Sandbox Code Playgroud)

另请注意,在Scala中,您可以在名称之后写入类型,而不是之前.


vir*_*yes 5

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

val count = map.get(key) fold(0)(num => num)
Run Code Online (Sandbox Code Playgroud)

之前最知道用户来砸我,"选项没有折!",折已添加到选项在斯卡拉2.10

在当前情况下,getOrElse当然更好,但是在一些Some/None场景中,对于带有折叠的1-liner而言可能很有趣(编辑了@Debiliski的补充,他们测试了最新的2.10快照):

val count = map.get(k).fold(0)(dao.userlog.count(_))
Run Code Online (Sandbox Code Playgroud)

我想在2.9.2和我们已经可以做到:

val count = map get(k) map ( dao.userlog.count(_) ) getOrElse(0)
Run Code Online (Sandbox Code Playgroud)

也就是说,在Scala中通常有不止一种方法可以做同样的事情:在链接线程中,OP显示超过10种替代方法来实现Option折叠;-)