将scala中的几个层次选项扁平化
我有点搞不清一个有很多选项的case类 我的案例类是Person,如下所示:将scala中的几个层次选项扁平化,scala,Scala,我有点搞不清一个有很多选项的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]) for { person <- personOption
case class Person(name: String, metadata: Option[Metadata])
case class Metadata(contacts: Option[List[Contact]])
case class Contact(id: Int, isAvailable: Option[Boolean])
for {
person <- personOption
metadata <- person.metadata
contacts <- metadata.contacts
} yield Person(
person.name,
Some(Metadata(
Some(contacts.filter(_.isAvailable.contains(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))
)
)
)
)
)
)
您将如何做到这一点?看看quicklens: 它将是:
person.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true))
如果需要修改选项[Person]
,则需要添加映射
:
personOpt.map(_.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true)))
请看quicklens: 它将是:
person.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true))
如果需要修改选项[Person]
,则需要添加映射
:
personOpt.map(_.modify(_.metadata.contacts).using(_.filter(_.isAvailable == Some(true)))
如果没有外部依赖项,则类似于:
case class Person(name: String, metadata: Option[Metadata])
case class Metadata(contacts: Option[List[Contact]])
case class Contact(id: Int, isAvailable: Option[Boolean])
for {
person <- personOption
metadata <- person.metadata
contacts <- metadata.contacts
} yield Person(
person.name,
Some(Metadata(
Some(contacts.filter(_.isAvailable.contains(true)))
))
)
用于{
个人没有外部依赖,类似这样:
case class Person(name: String, metadata: Option[Metadata])
case class Metadata(contacts: Option[List[Contact]])
case class Contact(id: Int, isAvailable: Option[Boolean])
for {
person <- personOption
metadata <- person.metadata
contacts <- metadata.contacts
} yield Person(
person.name,
Some(Metadata(
Some(contacts.filter(_.isAvailable.contains(true)))
))
)
用于{
人