映射到 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)
结果。
省略 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
我有一个不可变的 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
.
这些空元组从何而来?有没有一种简单方法可以避免它们?
我想要一个 List(2, 3)
结果。
省略 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