Конвертировать карту в класс Case - PullRequest
0 голосов
/ 07 ноября 2019

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

case class Messages (log_component: String)

Я получаю поток Кафки, который отображается для получения желаемого результата из -

        var a = scala.collection.mutable.Map[String, String]()

        for (x <- split_data) {
                    val split_stream = x.split("")

                    if (split_stream.length == 2) a += (split_stream(0) -> split_stream(1))
                    else a += (split_stream(0) -> "")
                  }

Я хочу преобразоватьданные карты, которые я получаю в к классу предоставленного случая. Как получить значения, которые я получаю после сопоставления, и преобразовать их в класс case

Спасибо

Пример данных

val of a is 
Map(log_component -> "HTTP")  (I'm getting this after mapping)

Я хочу сохранить HTTP в классе Case в log_componentвыражение этого

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Я постараюсь ответить на заголовок вашего вопроса. Тело (объяснение) вашего вопроса сбито с толку.

Допустим, у вас есть класс, в котором все параметры конструктора имеют одинаковый тип.

case class Person(fName :String, lName :String, room :String)

И скажем, у вас естьMap, который содержит все данные, необходимые для создания нового экземпляра нашего класса. (Вот почему параметры конструктора одного типа. Все значения в Map имеют одинаковый тип.)

val data = Map("fName" -> "Jo", "room" -> "A43", "lName" -> "Hu")

Теперь вы можете заполнить Person из значений Map.

val nextPrsn = Person(data("fName"), data("lName"), data("room"))

Или вы можете использовать более подробную форму. Преимущество состоит в том, что параметры могут быть заданы в любом порядке.

val nextPrsn = Person( room  = data("room")
                     , lName = data("lName")
                     , fName = data("fName") )

Но здесь есть проблема. Что, если Map заполнен неправильно? Возможно, пара ключ-> значение отсутствует или не указана должным образом.

val data = Map("lName" -> "Hu", "fName" -> "Jo", "Rm#" -> "A43")  //wrong "room" key

Теперь при попытке доступа к data("room") возникнет исключение. Не хорошо.

Одним из относительно простых исправлений является установка по умолчанию для любых пропущенных значений. Вы можете прикрепить значение по умолчанию к Map, которое будет значением по умолчанию для любых / всех пропущенных значений ...

val data = Map("lName" -> "Hu", "fName" -> "Jo", "Rm#" -> "A43").withDefaultValue("N/A")

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

val nextPrsn = Person( data.getOrElse("fName", "") )
                     , data.getOrElse("lName", "unknown")
                     , data.getOrElse("room",  "-") )
0 голосов
/ 07 ноября 2019

Я не уверен, правильно ли я понимаю ваш вопрос.

Вы ищете это:

val res1 = Map("log_component" -> "HTTP").values.map(Messages(_))

Возвращает List(Messages(HTTP))

Если вы хотитесделать это напрямую, ваш код может выглядеть следующим образом:

  val res1 = for (x <- split_data) {
    val split_stream = x.split(";") // I added here a character!
    if (split_stream.length == 2) 
      Messages(split_stream(1))
    else Messages("")
  }

Конечно, это также возвращает List(Messages(HTTP))

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