Как создать экземпляр класса дела Scala с экземпляром Map - PullRequest
0 голосов
/ 17 мая 2018

Я хочу создать класс случая scala, поля которого образуют карту.И, вот класс случая

 case class UserFeature(uid: String = null,
                     age: String = null,
                     marriageStatus: String = null,
                     consumptionAbility: String = null,
                     LBS: String = null,
                     interest1: String = null,
                     interest2: String = null,
                     interest3: String = null,
                     interest4: String = null,
                     interest5: String = null,
                     kw1: String = null,
                     kw2: String = null,
                     kw3: String = null,
                     topic1: String = null,
                     topic2: String = null,
                     topic3: String = null,
                     appIdInstall: String = null,
                     appIdAction: String = null,
                     ct: String = null,
                     os: String = null,
                     carrier: String = null,
                     house: String = null
                          )

предположим, что экземпляр карты равен

Map("uid" -> "4564131",
    "age" -> "5",
    "ct" -> "bk7755")

как я могу применить ключи и значения карты к полям и значениям класса случая?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Не рекомендуется использовать null для представления пропущенных строковых значений.Вместо этого используйте Option[String].

case class UserFeature(uid: Option[String] = None,
                       age: Option[String] = None,
                       marriageStatus: Option[String] = None,
                       ...

Как только вы это сделаете, вы можете использовать get на карте, чтобы получить значение.

UserFeature(map.get("uid"), map.get("age"), map.get("marriageStatus") ...)

Значения, которые присутствуют вкарта будет Some(value), а пропущенные значения будут None.Класс Option имеет множество полезных методов для безопасной обработки необязательных значений.

0 голосов
/ 18 мая 2018

Синтезируя два других ответа, я бы конвертировал все String s в UserFeature, которые вы используете по умолчанию, в null (которые вы в принципе никогда не должны использовать в Scala, если для этого не требуется взаимодействие с плохо написанным кодом Java)и даже тогда используйте его как можно меньше) до Option[String].Я оставляю этот поиск и замену вне ответа.

Тогда вы можете сделать:

object UserFeature {
  def apply(map: Map[String, String]): UserFeature =
    UserFeature(map.get("uid"), map.get("age") ...)
}

Что позволяет использовать:

val someMap: Map[String, String] = ...
val userFeature = UserFeature(someMap)

С изменениемк Option[String], будут некоторые другие изменения, которые должны быть сделаны в вашей кодовой базе.https://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html - хорошее руководство по работе с Option.

0 голосов
/ 17 мая 2018

Вы можете сделать UserFeature(uid = map_var("uid"), age = map_var("age"), ct = map_var("ct")) при условии, что переменная, удерживающая Map, равна map_var, а ключи доступны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...