在没有 isDefined 的情况下,在 Scala 等效项中过滤 Option 序列

Filter Sequence of Option in scala equivalent without isDefined

我想摆脱 isDefinedget

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)