一些嵌套的 case 类,其中字段 addresses
是一个 Seq[Address]
:
// ... 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
}
}))
}))
修改后的员工如下:
Employee(Company(List(
Address(Street(aaa street)),
Address(Street(Bbb street)),
Address(Street(Bpp street)))))
我正在寻找改进它的方法,但是找不到。甚至尝试了Monocle,但无法应用到这个问题上。
有没有方法使其更好?
备注:有两个关键要求:
- 只使用不可变数据
- 不丢失其他现有字段