I want to get rid of isDefined
and get
val t = Seq(A(Option("abc")), A(Option("abc")), A(Option("abc")), A(None))
t.filter(_.x.isDefined).groupBy(e=>e.x.get)
The code is complex , result I need is Map[String,Seq[String]]
CodePudding user response:
You could groupBy x
instead of x.get
and then flatMap the result to filter out the None
group and extract the value from the Some
s in one go.
t.groupBy(_.x).flatMap{ case (keyOpt, value) => keyOpt.map(_ -> value) }
That has the same effect as the code you posted. However if you want a Map[String,Seq[String]]
instead of a Map[String,Seq[A]]
you could do this instead:
t.flatMap(_.x).groupBy(identity)
Though grouping by identity might be a bit weird unless your ultimate goal is simply to count:
t.flatMap(_.x).groupMapReduce(identity)(_ => 1)(_ _)
CodePudding user response:
So assuming all you want is a Map[String, Seq[String]]
where the values are just the same key over and over again; you can do this:
t.collect {
case A(Some(x)) if x.nonEmpty => x
}.groupBy(identity)
CodePudding user response:
I am assuming A
is a case class
with a single parameter of optional type.
You can get the same result using the 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)
}
Here collect first check whether partial function
works for given value or not.