在没有 isDefined 的情况下,在 Scala 等效项中过滤 Option 序列
Filter Sequence of Option in scala equivalent without isDefined
我想摆脱 isDefined
和 get
val t = Seq(A(Option("abc")), A(Option("abc")), A(Option("abc")), A(None))
t.filter(_.x.isDefined).groupBy(e=>e.x.get)
代码比较复杂,我需要的结果是Map[String,Seq[String]]
您可以使用 groupBy x
而不是 x.get
,然后将结果 flatMap 以过滤掉 None
组并一次性从 Some
中提取值.
t.groupBy(_.x).flatMap{ case (keyOpt, value) => keyOpt.map(_ -> value) }
这与您发布的代码具有相同的效果。但是,如果您想要 Map[String,Seq[String]]
而不是 Map[String,Seq[A]]
,您可以这样做:
t.flatMap(_.x).groupBy(identity)
虽然按身份分组可能有点奇怪,除非您的最终目标只是计算:
t.flatMap(_.x).groupMapReduce(identity)(_ => 1)(_ + _)
我假设 A
是一个带有单个可选类型参数的 case class
。
您可以使用 partial functions
like
获得相同的结果
object FilterSeqOfOption extends App {
case class A(x : Option[String])
val t = Seq(A(Option("abc")), A(Option("abc")), A(Option("abc")), A(None))
val res = t.collect { case A(Some(x)) => A(Option(x))
}.groupBy{case A(Some(v)) => v}
println(res)
}
这里收集首先检查 partial function
是否适用于给定值。
因此,假设您想要的只是一个 Map[String, Seq[String]]
,其中的值一遍又一遍地只是相同的键;你可以这样做:
t.collect {
case A(Some(x)) if x.nonEmpty => x
}.groupBy(identity)
我想摆脱 isDefined
和 get
val t = Seq(A(Option("abc")), A(Option("abc")), A(Option("abc")), A(None))
t.filter(_.x.isDefined).groupBy(e=>e.x.get)
代码比较复杂,我需要的结果是Map[String,Seq[String]]
您可以使用 groupBy x
而不是 x.get
,然后将结果 flatMap 以过滤掉 None
组并一次性从 Some
中提取值.
t.groupBy(_.x).flatMap{ case (keyOpt, value) => keyOpt.map(_ -> value) }
这与您发布的代码具有相同的效果。但是,如果您想要 Map[String,Seq[String]]
而不是 Map[String,Seq[A]]
,您可以这样做:
t.flatMap(_.x).groupBy(identity)
虽然按身份分组可能有点奇怪,除非您的最终目标只是计算:
t.flatMap(_.x).groupMapReduce(identity)(_ => 1)(_ + _)
我假设 A
是一个带有单个可选类型参数的 case class
。
您可以使用 partial functions
like
object FilterSeqOfOption extends App {
case class A(x : Option[String])
val t = Seq(A(Option("abc")), A(Option("abc")), A(Option("abc")), A(None))
val res = t.collect { case A(Some(x)) => A(Option(x))
}.groupBy{case A(Some(v)) => v}
println(res)
}
这里收集首先检查 partial function
是否适用于给定值。
因此,假设您想要的只是一个 Map[String, Seq[String]]
,其中的值一遍又一遍地只是相同的键;你可以这样做:
t.collect {
case A(Some(x)) if x.nonEmpty => x
}.groupBy(identity)