【问题标题】:how to Create scala Map from list of optional items?如何从可选项目列表中创建 scala Map?
【发布时间】:2023-03-12 17:52:01
【问题描述】:

Scala 从选项元素列表创建地图?

myMap = (0 to r.numRows - 1).map { i =>
  if (Option(r.getValue(i,"Name")).isDefined)
    (r.getValue(i, "Name")) -> (r.getValue(i, "isAvailable").toString)
}.toMap
foo(myMap) //here At this point, I'm geting the exception

我试过上面的代码,但没有编译:

Exception:
Error:(158, 23) Cannot prove that Any <:< (T, U).
                }.toMap
                  ^

【问题讨论】:

  • 为什么在 i 迭代时不使用 i ?
  • 已编辑。 @suish 不,那不一样
  • 我猜 r.getValue("Name") 应该是 r.getValue(i, "Name")
  • 错误信息是什么?这段代码中有很多奇怪的语法。 if 条件不依赖于i,您可能需要elsecondition

标签: scala


【解决方案1】:

也许试试这个代码:

val myMap = (0 until r.numRows) flatMap { i =>
  for {
    name <- Option(r.getValue(i, "Name"))
    available = r.getValue(i, "isAvailable").toString
  } yield (name, available)
}.toMap
foo(myMap)

您的问题很可能是您使用if 而不使用else,而if 是scala 中的一个表达式,这意味着它的计算结果是什么。

if (2 > 3) true

等价于

if (2 > 3) true else ()

所以类型是UnitBoolean 的公共超类型Any,这是你得到的错误。

请注意,您可以将to-1 替换为until,它的作用相同,但更具可读性。

您不应该真正检查 OptionisDefined 并对结果执行操作,如果这是真的,请使用 map 操作。

稍微解释一下我的实现:for 部分将评估为Option[(String, String)],如果存在"Name" 键,则将包含您的元组,否则None。从概念上讲,flatMap 将首先将您的索引范围更改为Option[(String, String)] 的序列,然后将其展平,即删除所有Nones 并解开所有Somes。

如果你也想检查"isAvailable"是否为空,你可以做类似的事情

for {
  name      <- Option(r.getValue(i, "Name"))
  available <- Option(r.getValue(i, "isAvailable"))
} yield (name, available.toString)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2015-01-17
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多