检查条件标量后将元素添加到地图

时间:2019-04-25 02:11:56

标签: scala apache-spark

我有一个案例课

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
) 

但是需要做并了解我如何以更清洁的功能方式实现它。 ???

谢谢

2 个答案:

答案 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)