Scala Option[(A, B)] 模式匹配

标签 scala pattern-matching scala-option

我正在编写一个 Java 代码生成器。

我有一个不可变的 Map,其中包含来自 java.sql.Types 的映射。 [Int] 到 (String, String) 的元组其中第一个值是 Java 类型,第二个值是 Java 包,如果默认情况下未导入该类型,则从该包中导入该类型( java.lang ):

val SqlTypesToJavaTypeNames =
    Map(Types.BIGINT -> ("Long", None),
        Types.BINARY -> ("byte[]", None),
        Types.BIT -> ("Boolean", None),
        Types.BOOLEAN -> ("Boolean", None),
        Types.CHAR -> ("String", None),
        Types.DATE -> ("Date", Some("java.sql.Date")),
        Types.DECIMAL -> ("BigDecimal", Some("java.math.BigDecimal")),
        Types.DOUBLE -> ("Double", None),
        Types.FLOAT -> ("Float", None),
        Types.INTEGER -> ("Integer", None),
        Types.LONGNVARCHAR -> ("String", None),
        Types.LONGVARCHAR -> ("String", None),
        Types.NCHAR -> ("String", None),
        Types.NUMERIC -> ("BigDecimal", None),
        Types.NVARCHAR -> ("String", None),
        Types.REAL -> ("Float", None),
        Types.SMALLINT -> ("Short", None),
        Types.SQLXML -> ("String", None),
        Types.TIME -> ("Time", Some("java.sql.Time")),
        Types.TIMESTAMP -> ("Timestamp", Some("java.sql.Timestamp")),
        Types.TINYINT -> ("Byte", None),
        Types.VARCHAR -> ("String", None))

我正在尝试在搜索此 map 时进行模式匹配,其中 dataTypejava.sql.Types来自数据库元数据的值:
val (javaType, importType) =
  SqlTypesToJavaTypeNames.get(dataType) match {
    case Some(jType, Some(iType)) => (jType, iType)
    case Some(jType, None) => (jType, null)
    case None => throw new IllegalStateException("Unknown translation to Java type for SQL type " + dataType)
  }

编译器在第一个 case 上给我一个错误(以 case Some(jType, Some(iType)) 开头):error: wrong number of arguments for <none>: (x: (java.lang.String, Option[java.lang.String]))Some[(java.lang.String, Option[java.lang.String])]
我不确定出了什么问题。

最佳答案

Some不提取到两个值,它提取到一个。如果你想匹配一些对,那么你需要在括号上加倍:

case Some( (jType, Some(iType)) ) => (jType, iType)

如果您可以将箭头约定用作提取器,那就太好了,但遗憾的是,这似乎不起作用:
case Some(jType -> Some(iType)) => (jType, iType)

更新

或者,考虑到您正在使用 Option,您可以利用其 monadic 性质并简单地映射该事物:
val tpes = SqlTypesToJavaTypeNames.get(dataType)
val (javaType, importType) =
  tpes map { case (a,b) => (a, b.orNull) } getOrElse { throw ... }

关于Scala Option[(A, B)] 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023353/

相关文章:

scala - 如何从 map /过滤器/等执行异步操作(即返回 future )?

scala - 编译器无法识别自类型注释

Scala下划线解释

javascript - 正则表达式替换失败,我不明白原因?

scala - 嵌套 Scala 匹配器为什么 Some(Some(1),1) 无法匹配?

scala - 如何过滤列表[选项]中的“无”?

scala - 在到达第一个None时如何停止构建Option [Collection]?

java - 为什么当 String.valueOf() 进行强制转换时 toString 不起作用

python - 如何在 python 中将多个正则表达式组合成一个?

java - 将字母数字字符串转换为数字和字符串映射时生成的空映射