有人可以举例说明如何使用HashMap forall()方法吗?我发现Scala文档难以理解.
我想要的是这样的:
val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20)
val areAllValuesTenTimesTheKey = myMap.forall((k, v) => k * 10 == v)
Run Code Online (Sandbox Code Playgroud)
但这给了:
error: wrong number of parameters; expected = 1
Run Code Online (Sandbox Code Playgroud)
Sco*_*son 12
你需要改为
val myMap = HashMap[Int, Int](1 -> 10, 2 -> 20)
val areAllValuesTenTimesTheKey = myMap.forall { case (k, v) => k * 10 == v }
Run Code Online (Sandbox Code Playgroud)
问题是forall想要一个只需要一个Tuple2而不是两个参数的函数.(我们的思维Map[A,B]作为Iterable[(A,B)]当我们使用forall.)使用CASE语句,是一个很好的解决办法; 它真的在这里使用模式匹配来分解Tuple2和给出部件名称.
如果你不想使用模式匹配,你也可以写
val areAllValuesTenTimesTheKey = myMap.forall(p => p._1 * 10 == p._2 }
Run Code Online (Sandbox Code Playgroud)
但我认为这没那么有用.
小智 8
forall传递单个(Int, Int)元组(而不是多个参数).考虑这个(明确显示单个元组值被分解):
val areAllValuesTenTimesTheKey = myMap.forall(t => t match { case (k, v) => k * 10 == v })
Run Code Online (Sandbox Code Playgroud)
或者,简写(实际传递PartialFunction):
val areAllValuesTenTimesTheKey = myMap.forall {case (k, v) => k * 10 == v}
Run Code Online (Sandbox Code Playgroud)
(这些都会分解元组接收.)
此外,该功能可以"编组":
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
Run Code Online (Sandbox Code Playgroud)
快乐的编码.