在 Scala 中使用通用数据类型值定义 Map
Define Map with generic datatype value in Scala
我必须在 Scala 中构建地图,以便我可以从对 Java 代码的调用中收集所有数据。可能的值为 String
、Integer
、Double
和 null
。有没有办法在 Scala 中表示这个地图?我正在尝试使用如下选项,但不确定它的类型应该是什么。
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()
)
}
以类型安全的方式很容易做到这一点:
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"
}
我必须在 Scala 中构建地图,以便我可以从对 Java 代码的调用中收集所有数据。可能的值为 String
、Integer
、Double
和 null
。有没有办法在 Scala 中表示这个地图?我正在尝试使用如下选项,但不确定它的类型应该是什么。
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()
)
}
以类型安全的方式很容易做到这一点:
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"
}