理解scala中的map、flatmap和option
在下面的例子中,我试图理解如何在scala中使用函数编程概念(map、flatmap、filter…)。基本上,我试图用理解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
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