【问题标题】:Adding elements to a Map after checking condition scala检查条件scala后将元素添加到地图
【发布时间】:2019-04-25 19:47:53
【问题描述】:

我有一个案例类

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
) 

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

谢谢

【问题讨论】:

  • 提示:你可以定义case类对象DDD,这里你写你根据你的具体情况定义你的辅助构造函数

标签: scala apache-spark


【解决方案1】:

这样的事情怎么样。

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)

【讨论】:

  • 不想单独设置mapKeys
  • @AJm 将键作为外部列表有什么问题?
  • 我们有一定的代码标准遵循这个不会被接受
  • @AJm 什么代码标准不允许这样做?出于什么具体原因? - 此外,如果您不能将键作为任何类型的集合,则不会有任何其他解决方案来检查条件并逐个添加值。
【解决方案2】:

为什么不为那个案例类创建一个自定义的 unapply 方法?

默认情况下,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)

我觉得这样更干净

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-01-27
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多