HashMap forall()方法的Scala中的示例?

有人可以举一个如何使用HashMap forall()方法的例子吗? 我发现斯卡拉文件是不可逾越的。

我想要的是这样的:

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

你需要改变

val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20) 
val areAllValuesTenTimesTheKey = myMap.forall { case (k, v) => k * 10 == v }

问题是forall需要一个采用单个Tuple2的函数,而不是两个参数。 (当我们使用forallIterable[(A,B)]我们正在考虑Map[A,B]作为Iterable[(A,B)] 。)使用case语句是一个很好的解决方法; 它真的在这里使用模式匹配来拆分Tuple2并给出零件名称。

如果你不想使用模式匹配,你也可以写

val areAllValuesTenTimesTheKey = myMap.forall(p => p._1 * 10 == p._2 }

但我认为这不太有用。


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}

(这些都会分解元组。)

另外,该函数可以“tupled”编辑:

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

快乐的编码。


与您的代码的问题,是你给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方法

链接地址: http://www.djcxy.com/p/86195.html

上一篇: Example in Scala of hashmap forall() method?

下一篇: Get item in the list in Scala?