Scalaオプション[(A、B)]パターンマッチング
-
14-11-2019 - |
質問
私はJavaコードジェネレータを書きます。
java.sql.Types
[int]から最初の値がJava型で、デフォルトでインポートされていない場合の2番目のJavaパッケージの(String, String)
からのマッピングを含む不変マップがあります。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))
.
このマップの検索に合わせてマッチしようとしています。
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)
}
.
コンパイラは最初のdataType
のエラーを与えています(java.sql.Types
から始まります):case
何が悪いのかわからない。
解決
Some
は2つの値に抽出しないと、1に抽出します。いくつかのペアを一致させたい場合は、括弧内に再起動する必要があります。
case Some( (jType, Some(iType)) ) => (jType, iType)
.
抽出者として矢印コンベンションを使用することができればいいだろうが、悲しいように機能していないようには思わない:
case Some(jType -> Some(iType)) => (jType, iType)
.
更新
あるいは、あなたがオプションを使用していることを考えると、そのモナディの性質を利用し、単にものをマップすることができます:
.val tpes = SqlTypesToJavaTypeNames.get(dataType)
val (javaType, importType) =
tpes map { case (a,b) => (a, b.orNull) } getOrElse { throw ... }
他のヒント
内部のアナグレンがありません(Option[(A, B)]
があるため:
case Some( (jType, Some(iType)) ) =>
case Some( (jType, _) ) =>
case None =>
.
あなたの方法の外観から、それはさらに単純化できるようです:
SqlTypesToJavaTypeNames.get(dataType) map { case (jType, maybeIType) => jType -> maybeIType.orNull } getOrElse error("Unmapped : " + dataType)
. 所属していません StackOverflow