在hashmap forall()方法的Scala中的示例?

时间:2011-05-18 21:00:08

标签: scala

有人可以举例说明如何使用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

3 个答案:

答案 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