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
的函数,而不是两个参数。 (当我们使用forall
时Iterable[(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
方法