【问题标题】:Scala convert Option to an IntScala 将 Option 转换为 Int
【发布时间】:2012-04-17 08:50:58
【问题描述】:

我查看了这些链接

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

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

【问题讨论】:

  • 如果你得到一个选项,那么你有一个 Map[String, Option[Int]] 而不是 Map[String, Int]。
  • @MirkoN。不,这是因为 get 返回 Option[Value]。斯卡拉>Map(1 -> 2).get(1)res2: Option[Int] = Some(2)
  • 好吧,如果Int 不可用,你会怎么做?取决于答案,最佳解决方案是不同的。

标签: scala scala-collections


【解决方案1】:

只需使用 getOrElse 方法:

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

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

【讨论】:

  • 我遇到的问题是类型仍然是 Any 而不是 Integer。 map.getOrElse(key,0) 返回类型为 Any
【解决方案2】:

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

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

在知情用户抨击我之前,“选项没有折叠!”,fold has been added to Option in Scala 2.10

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 ;-)

【讨论】:

  • 是的,当我遇到 scala-lang 线程时我也很兴奋 ;-) 希望 Scala Days 会议结束后很快会发布 2.10 M3,在 Scala 中有很多值得期待的地方。下一个
  • @virtualeyes:那将是 2.10 中的 map.get(key).fold(0)(num => num)(至少按照当前的每晚)。
  • @Debilski,对,在 scala-lang 线程中采用 OP 的方法;订单(一些,无)或(无,一些)有很多来回;根据他的最新提交“github.com/scala/scala/commit/bb4935e92c”,看起来保罗菲利普斯选择了(无)(一些)。我会编辑我的答案,以免进一步误导 ;-) 谢谢
  • "fold(0)(num => num)" 有点烦人,"fold(0)(x)" 会非常简洁...
  • 这毫无意义:(none => 0, num => num)None 的情况下没有传递任何值,所以折叠它不需要函数。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2016-04-14
    • 2016-04-11
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多