有人可以举例说明如何使用HashMap forall()方法吗?我发现Scala文档难以理解。
我想要的是这样的:
val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20)
val areAllValuesTenTimesTheKey = myMap.forall((k, v) => k * 10 == v)
但这给出了:
error: wrong number of parameters; expected = 1
答案 0 :(得分:12)
你需要
val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20)
val areAllValuesTenTimesTheKey = myMap.forall { case (k, v) => k * 10 == v }
问题是forall想要一个只需要Tuple2
个而不是两个参数的函数。 (当我们使用Map[A,B]
时,我们将Iterable[(A,B)]
视为forall
。)使用case语句是一个很好的解决方法;它真的在这里使用模式匹配来分解Tuple2
并给出部件名称。
如果你不想使用模式匹配,你也可以写
val areAllValuesTenTimesTheKey = myMap.forall(p => p._1 * 10 == p._2 }
但我认为这不太有帮助。
答案 1 :(得分:8)
forall
传递一个(Int, Int)
元组(而不是多个参数)。考虑一下(明确显示单个元组值被分解):
val areAllValuesTenTimesTheKey = myMap.forall(t => t match { case (k, v) => k * 10 == v })
或者,简称(实际通过PartialFunction):
val areAllValuesTenTimesTheKey = myMap.forall {case (k, v) => k * 10 == v}
(这些都会分解元组接收。)
此外,该功能可以“编组”编辑:
val myMap = Map((1,10), (2,20))
val fn = (k: Int, v: Int) => k * 10 == v
val tupled_fn = fn.tupled
val areAllValuesTenTimesTheKey = myMap.forall(tupled_fn)
myMap: scala.collection.immutable.Map[Int,Int] = Map((1,10), (2,20))
fn: (Int, Int) => Boolean = // takes in two parameters
tupled_fn: ((Int, Int)) => Boolean = // note that it now takes in a single Tuple
areAllValuesTenTimesTheKey: Boolean = true
快乐的编码。
答案 2 :(得分:3)
代码的问题在于,您为forall
方法提供了一个函数,该函数接受2个参数并返回Boolean
,或者换句话说(Int, Int) => Boolean
。如果您查看文档,那么您将找到此签名:
def forall (p: ((A, B)) => Boolean): Boolean
在这种情况下,forall
方法需要Tuple2[A, B] => Boolean
,所以它也可以这样写:
def forall (p: Tuple2[A, B] => Boolean): Boolean
为了修复你的例子你可以调用forall
并赋予它接受1元组参数的函数:
myMap.forall(keyVal => keyVal._1 * 10 == keyVal._2)
或者您将模式匹配并提取键和值:
myMap.forall {case (k, v) => k * 10 == v}
在这种情况下,您将PartialFunction[(Int, Int), Boolean]
方法提供给forall