我有一张地图,我想通过yield将它转换为一个新的集合,根据键进行过滤.我只希望地图条目的子集在新集合中.
scala> val the_map = Map(1->10, 2->41, 3->41, 27->614, 400->541, 5214 -> 2)
the_map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 41, 27 -> 614, 3 -> 41, 400 -> 541)
scala> val transformed = for ((k, v) <- the_map) yield {if (k < 10) { v * 10 } else if (k > 100 && k < 400) { v * 5 }}
transformed: scala.collection.immutable.Iterable[AnyVal] = List(100, 410, (), 410, 2705, ())
Run Code Online (Sandbox Code Playgroud)
所以我基本上想要那个,但是没有()s,并且类型是Iterable [Int].这里有什么正确的方法?我可以过滤删除()然后施放,但这似乎是错误的.我可以将所有的值都放在底部,然后调用flatten,但这似乎过分了.有干净的路吗?我只想要yield忽略当没有if语句匹配时返回的().
flatMap 是去的地方:
val transformed =
the_map.flatMap {
case (k, v) =>
if (k < 10)
Some(v * 10)
else if (k > 100 && k < 400)
Some(v * 5)
else None
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用折叠显式地执行此操作(尽管我发现它不如方法清晰flatMap):
val transformed2 =
the_map.foldLeft(Vector.empty[Int]) {
case (z, (k, v)) =>
if (k < 10)
z :+ (v * 10)
else if (k > 100 && k < 400)
z :+ (v * 5)
else z
}
Run Code Online (Sandbox Code Playgroud)