Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将scala中的几个层次选项扁平化_Scala - Fatal编程技术网

将scala中的几个层次选项扁平化

将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类

我的案例类是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
  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)))
  ))
)
用于{
人