Некоторые вложенные классы случаев и поле addresses
является Seq[Address]
:Как изменить эти вложенные классы case с полями «Seq»?
// ... means other fields
case class Street(name: String, ...)
case class Address(street: Street, ...)
case class Company(addresses: Seq[Address], ...)
case class Employee(company: Company, ...)
У меня есть сотрудник:
val employee = Employee(Company(Seq(
Address(Street("aaa street")),
Address(Street("bbb street")),
Address(Street("bpp street")))))
Он имеет 3 адреса.
И я хочу использовать прописные буквы, начинающиеся с буквы «b». Мой код бардак, как следующее:
val modified = employee.copy(company = employee.company.copy(addresses =
employee.company.addresses.map { address =>
address.copy(street = address.street.copy(name = {
if (address.street.name.startsWith("b")) {
address.street.name.capitalize
} else {
address.street.name
}
}))
}))
modified
работник затем:
Employee(Company(List(
Address(Street(aaa street)),
Address(Street(Bbb street)),
Address(Street(Bpp street)))))
Я ищу способ улучшить его, и не может найти. Даже попробовал Monocle, но не может применить его к этой проблеме.
Есть ли способ сделать это лучше?
PS: Есть два ключевых требования:
- используют только неизменные данные
- не теряют других существующих полей
Спасибо так много !!! Это действительно здорово. Наконец-то я получил шанс узнать, насколько мощным бесформенным! – Freewind
Хороший ответ, но см. Мой для предупреждения (это преобразит _any_ названия улиц в структуре данных). –