Имея класс case с вложенными опциями, как мне преобразовать его в класс-близнец без опций, извлекая Some
и заменяя None
значениями по умолчанию.
Допустим, у нас есть:
case class UserPreferencesOpt(animals: Option[AnimalPreferencesOpt])
case class AnimalPreferencesOpt(dogs: Option[String], cats: Option[String])
case class UserPreferences(animals: AnimalPreferences)
object UserPreferences {
def getDefault: UserPreferences(AnimalPreferences("bark", "meow")
}
case class AnimalPreferences(dogs: String, cats: String)
Итак, в основном, я хотел бы преобразовать:
UserPreferencesOpt(Some(AnimalPreferencesOpt(Some("Dogs are cool!"), None)))
в:
UserPreferences(AnimalPreferences("Dogs are cool!", "meow")
путем извлечения параметров, если они есть, и замены отсутствующих значением по умолчанию.
Это можно сделать путем сопоставления с образцом и проверки значения за значением, но это всего лишь пример. Очевидно, что во многих случаях в логике домена будет гораздо больше вложенных предпочтений, и мне интересно, можно ли преобразовать его без добавления дополнительных совпадений и случаев, когда добавляются новые предпочтения (например, WeatherPreferences
или еще что-то внутри UserPreferences).
Услышав о некоторых продвинутых вещах Scala, таких как Shapeless или макросы, я думаю, что кто-нибудь может порекомендовать это, но есть ли способ добиться этого идиоматично, функционально, в стиле Scala?
Reads.pure
) и преобразовать непосредственно в классы моделей, с которыми вы работаете внутри, или сначала в промежуточные классы, связанные с пользовательским интерфейсом (потому что, например, если некоторые нетривиальные дополнительные требуется проверка), которые могут быть преобразованы на месте в классы моделей. Для других json-libs думаю, что значения по умолчанию также должны быть доступны. 13.03.2018