我有一个案例课
case class DDD(abc: String, v1: String, v2: String)
,我有一个基于DDD(模式)的元组。想象一下
val sample1 = DDD("a1", "v0001", "v0002")
然后我用这样的元组值制作一个地图
val tMap = Map("col_name" -> sample1.abc, "col_old" -> sample1.v1, "col_new" -> sample1.v2)
但是在某些情况下,我的元组中的v1或v2值可能为空/空/空,并且如果不存在该值,我不想将该键值对添加到我的地图中,因此 例如
If
val sample2 = DDD("a1", "null", "v0002")
Then
val tMap = Map("col_name" -> sample1.abc, "col_new" -> sample1.v2)
我可以简单地通过使用以下if条件来实现此目的
val sample2 = DDD("a1", "null", "v0002")
val tMap = Map("col_old" -> (if(sample2.v1 != "null") sample2.v1),
"col_new" -> (if(sample2.v2 != "null") sample2.v2
"abc" -> (if(sample2.abc != "null") sample2.abc
)
但是需要做并了解我如何以更清洁的功能方式实现它。 ???
谢谢
答案 0 :(得分:1)
为什么不为该案例类创建自定义的不应用方法?
默认情况下,Scala创建一个单例对象,其中指定了apply和unapply方法。因此,您应该创建另一个。
object DDD {
def unapply(arg: DDD): Map[String, String] = {
def mapIfNotNull(key:String, value:String):Option[(String, String)] = if (value == "null") None else Some(key -> value)
Seq(
mapIfNotNull("col_name", arg.abc),
mapIfNotNull("col_old", arg.v1),
mapIfNotNull("col_new", arg.v2)
).flatten.toMap
}
}
然后,您可以稍后使用此单例取消应用案例类实例。
DDD.unapply(sample1)
我认为这样更清洁
答案 1 :(得分:0)
怎么样?
case class DDD(abc: String, v1: String, v2: String)
val sample1 = DDD("a1", "null", "v0002")
val mapKeys = List("col_name", "col_old", "col_new")
val tMap =
(mapKeys.toIterator zip sample1.productIterator).collect {
case (k, v: String) if (v != "null")=> k -> v
}.toMap
// tMap: Map[String, String] = Map(col_name -> a1, col_new -> v0002)