выравнивание нескольких иерархических опций в scala - PullRequest
0 голосов
/ 17 марта 2020

Я немного растерялся из-за того, что исключил класс case, в котором есть куча Option.

Мой класс case - это Person, который выглядит следующим образом:

case class Person(name: String, metadata: Option[Metadata])

case class Metadata(contacts: Option[List[Contact]])

case class Contact(id: Int, isAvailable: Option[Boolean])

what I хочу, чтобы взять опцию Person и сделать копию этого человека, но с контактами isAvailable равно true.

, поэтому, если у нас есть объект ниже:

Some(
Person(
  "John",
  Some(
    Metadata(
      Some(
        List(
          Contact(1, Some(true)),
          Contact(2, None),
          Contact(3, Some(false)),
          Contact(4, Some(true))
        )
      )
    )
  )
 )
)

результат будет :

Some(
Person(
  "John",
  Some(
    Metadata(
      Some(
        List(
          Contact(1, Some(true)),
          Contact(4, Some(true))
        )
      )
    )
  )
 )
)

как бы ты это сделал?

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Без внешних зависимостей, что-то вроде этого:

for {
  person   <- personOption
  metadata <- person.metadata
  contacts <- metadata.contacts
} yield Person(
  person.name, 
  Some(Metadata(
    Some(contacts.filter(_.isAvailable.contains(true)))
  ))
)
1 голос
/ 17 марта 2020

Взгляните на quicklens: https://github.com/softwaremill/quicklens

Это будет:

person.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true))

Если вам нужно изменить Option[Person], вам нужно добавить map:

personOpt.map(_.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...