理解scala中的map、flatmap和option

理解scala中的map、flatmap和option,scala,Scala,在下面的例子中,我试图理解如何在scala中使用函数编程概念(map、flatmap、filter…)。基本上,我试图用id过滤Inner1,并在这里读取value。如果我引用了out对象,您能告诉我如何读取v(值)吗 final case class Inner2(v:Option[String]) final case class Inner1(id: String,inner2: Seq[Inner2]) final case class Out(inner1: Option[Seq[In

在下面的例子中,我试图理解如何在scala中使用函数编程概念(map、flatmap、filter…)。基本上,我试图用
id
过滤Inner1,并在这里读取
value
。如果我引用了
out
对象,您能告诉我如何读取v(值)吗

final case class Inner2(v:Option[String])
final case class Inner1(id: String,inner2: Seq[Inner2])
final case class Out(inner1: Option[Seq[Inner1]])
val inner2 = Inner2(Some("value"))
val inner11 = Inner1("id",List(inner2))
val inner12 = Inner1("id2",List())
val out = Out(Some(List(inner11,inner12)))
我知道下面的代码是不正确的,但我把它放在这里是为了说明要做什么

out.inner1
  .flatMap(_.headOption)
  .filter(_.id=="id")
  .map(_.inner2)
  .flatMap(_.headOption)
  .flatMap(_.v)

在找这样的东西吗

out.inner1
.平面图{
_.withFilter(u.id==“id”).flatMap{
_.inner2.flatMap{
_五
}
}.头选项
}
//println给出了一些(值)`

如果您想提取选项值,您可以使用
.getOrElse(“”
)最终

我认为您的解决方案非常接近您所能做的-我将为您的对象提供正确的名称和类型,然后您的代码开始变得更有意义

我刚刚从
外部
类中删除了
选项
(作为空的
Seq
也是
):

然后代码得到如下结果:

out.inner1
   .filter(_.id=="id")
   .flatMap(_.inner2)
   .flatMap(_.v.toSeq) // > List(value)
   .headOption         // > Some(value)
如果使用专有名称,它可能看起来像:

repo.users // Out -> Repo - Inner1 > User
   .filter(_.id=="id")
   .flatMap(_.addresses) // Inner2 -> Address
   .flatMap(_.maybeStreet.toSeq) // value -> optional street
   .headOption         

你到底想做什么?可能错误在于您混合了选项和Seq/List。您的类层次结构有点奇怪,因为集合可以是空的,
collection[Seq[T]]
通常没有意义。
repo.users // Out -> Repo - Inner1 > User
   .filter(_.id=="id")
   .flatMap(_.addresses) // Inner2 -> Address
   .flatMap(_.maybeStreet.toSeq) // value -> optional street
   .headOption