映射到 HashMap 上并避免空结果

Map over HashMap and avoid empty results

我有一个不可变的 HashMap:

val hashmap = Seq(1,2,3,3,2).groupBy(identity).map({x => x._1 -> x._2.length})

println(hashmap)
// HashMap(1 -> 1, 2 -> 2, 3 -> 2)

我尝试按值 (2) 过滤它并获取键:

val res = hashmap.map({ case (key, value) => if (value == 2) key})

println(res)
// List((), 2, 3)

然而,如果 hashmap 中有 key/value 对不满足 value==2.

,则它 returns 是一个空元组

这些空元组从何而来?有没有一种简单方法可以避免它们?

我想要一个 List(2, 3) 结果。

Online code

省略 else 子句

if (value == 2) key

等同于

if (value == 2) key else ()

这就是为什么

hashmap.map({ case (key, value) => if (value == 2) key})

评估为

val res0: scala.collection.immutable.Iterable[AnyVal] = List((), 2, 3)

改为尝试 collect,这在语义上等同于 map+filter

hashmap.collect { case (key, value) if value == 2 => key }
// val res2: scala.collection.immutable.Iterable[Int] = List(2, 3)

您的另一个选择是:

hashmap.filter(_._2 == 2).keys.toList

或者,如果您对 Set 也满意,您可以这样做:

hashmap.filter(_._2 == 2).keySet