Ral*_*lph 5 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))
Run Code Online (Sandbox Code Playgroud)
我试图在搜索此映射时模式匹配,其中dataType是java.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)
}
Run Code Online (Sandbox Code Playgroud)
编译器在第一个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])]
我不确定是什么问题.
Kev*_*ght 11
Some不提取到两个值,它提取为一个.如果你想匹配一对,那么你需要加倍括号:
case Some( (jType, Some(iType)) ) => (jType, iType)
Run Code Online (Sandbox Code Playgroud)
如果你可以使用箭头约定作为提取器,那将是很好的,但遗憾的是似乎不起作用:
case Some(jType -> Some(iType)) => (jType, iType)
Run Code Online (Sandbox Code Playgroud)
UPDATE
或者,鉴于您正在使用选项,您可以利用其monadic性质并简单地映射到该事物:
val tpes = SqlTypesToJavaTypeNames.get(dataType)
val (javaType, importType) =
tpes map { case (a,b) => (a, b.orNull) } getOrElse { throw ... }
Run Code Online (Sandbox Code Playgroud)
你错过了内在的parens(因为你有一个Option[(A, B)]:
case Some( (jType, Some(iType)) ) =>
case Some( (jType, _) ) =>
case None =>
Run Code Online (Sandbox Code Playgroud)
从你的方法看起来,你似乎可以简化更多:
SqlTypesToJavaTypeNames.get(dataType) map { case (jType, maybeIType) => jType -> maybeIType.orNull } getOrElse error("Unmapped : " + dataType)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |