java - 在 Scala 中使用通用数据类型值定义 Map

标签 java scala scala-option

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

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"
}

关于java - 在 Scala 中使用通用数据类型值定义 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448388/

相关文章:

java - 如何仅在测试运行时忽略类或方法

java - 可以将具有单个重复字符的Java字符串初始化为特定长度吗

scala - Option.fold - 为什么它的第二个参数不是二元运算符?

scala - 如何将 X => Option[R] 转换为 PartialFunction[X,R]

scala - 在 for 理解中将选项与列表组合会导致类型不匹配,具体取决于顺序

java - Keycloak 自定义以在身份验证流程中运行自定义 java

java - 了解缩小原始转换

Scalatest 和 scalamock - 涉及 SuiteMixin 的依赖问题

java - Scala 中公共(public)值的使用

mysql - 如何让Slick建表语句使用InnoDB