【问题标题】:Define Map with generic datatype value in Scala在 Scala 中使用通用数据类型值定义 Map
【发布时间】:2016-05-25 22:02:24
【问题描述】:

我必须在 Scala 中构建 Map,以便收集来自 Java 代码调用的所有数据。可能的值为StringIntegerDoublenull。有没有办法在 Scala 中表示这个地图?我试图让 Option 如下,但不确定它的类型应该是什么。

def createScalaMapaFromJavaBean(): Map[String, Option[XXX]] = {
  val someJavaBean = getMyBeanValues()
  Map(
    "key1" -> Option(someJavaBean.getAgeAsInteger()),
    "key2" -> Option(someJavaBean.getSalaryAsDouble()),
    "key3" -> Option(someJavaBean.getNameAsString()),
    "key4" -> Option(someJavaBean.getSomeFieldValuesAsNull()
 )
}

【问题讨论】:

  • 看起来你想要AnyRef。虽然你失去了类型安全

标签: java scala scala-option


【解决方案1】:

以类型安全的方式很容易做到这一点:

sealed trait MyType

case object MyNil extends MyType
case class MyInt(i: Int) extends MyType
case class MyDouble(d: Double) extends MyType
case class MyString(s: String) extends MyType

那么你的代码就变成了:

def createScalaMapaFromJavaBean(): Map[String, MyType] = {
  val someJavaBean = getMyBeanValues()
  Map(
    "key1" -> MyInt(someJavaBean.getAgeAsInteger()),
    "key2" -> MyDouble(someJavaBean.getSalaryAsDouble()),
    "key3" -> MyString(someJavaBean.getNameAsString()),
    "key4" -> MyNil
  )
}

您可能会以如下方式获取数据:

map.get(key) match {
  case Some(MyInt(i))    => // logic for ints
  case Some(MyDouble(d)) => // logic for doubles
  case Some(MyString(s)) => // logic for strings
  case Some(MyNil)       => // logic for nulls
  case None              => // logic for "key not found"
}

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多