假设我有一个类型为List[(Int, String)]
的键值对列表和一组类型为Set[Int]
的键。我正在编写一个函数来返回一个映射Map[Int, String]
,它包含给定集合中的所有键,只包含那些键。如果对不包含所有键或包含重复键,则返回错误。
为简单起见,我在此处返回Option
:Some
表示成功,None
表示失败。
def foo(pairs: List[(Int, String)], keys: Set[Int]): Option[Map[Int, String]] = {
val m = pairs.groupBy(_._1).filterKeys(keys)
if (m.keys != keys || m.exists(_._2.size != 1)) None else Some(m.mapValues(_.head._2))
}
上面的代码可能有效,但看起来很笨拙。你会如何改进它?
答案 0 :(得分:1)
def foo(pairs: List[(Int, String)], keys: Set[Int]): Option[Map[Int, String]] = {
val m = pairs.toMap
keys.subsetOf(m.keys.toSet) && m.size == pairs.size match {
case true => Some(m.filterKeys(keys))
case false => None
}
}
使用subsetOf
检查keys
是否为 map.keys 的subset
。