Я постараюсь ответить на заголовок вашего вопроса. Тело (объяснение) вашего вопроса сбито с толку.
Допустим, у вас есть класс, в котором все параметры конструктора имеют одинаковый тип.
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", "-") )