Добавление элементов на карту после проверки состояния scala - PullRequest
1 голос
/ 25 апреля 2019

У меня есть класс дела

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)

Я могуЧтобы достичь этого, просто используйте условие, как показано ниже:

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 ]

1 голос
/ 25 апреля 2019

Почему вы не создаете пользовательский метод неприменения для этого класса дел?

По умолчанию 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
    } 
}

Затем вы можете использовать этот синглтон позже, чтобы отменить применение экземпляра класса case.

0 голосов
/ 25 апреля 2019

Как насчет этого?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...