【发布时间】:2013-07-01 23:34:52
【问题描述】:
这对我来说似乎不合逻辑:
scala> val a = Map((1, "111"), (2, "222"))
a: scala.collection.immutable.Map[Int,String] = Map(1 -> 111, 2 -> 222)
scala> val b = a.map((key, value) => value)
<console>:8: error: wrong number of parameters; expected = 1
val b = a.map((key, value) => value)
^
scala> val c = a.map(x => x._2)
c: scala.collection.immutable.Iterable[String] = List(111, 222)
我知道我可以说val d = a.map({ case(key, value) => value })
但是为什么不能说 a.map((key, value) => value) 呢? 只有一个参数,类型为 Tuple2[Int, String] 或 Pair of Int, String。 a.map((key, value) => value) 和 a.map(x => x._2) 有什么区别?
更新:
val myTuple2 = (1, 2) -- 这是一个变量,对吗?
for ( (k, v) <- a ) yield v -- (k, v) 也只是一个变量,对吗?
map((key, value) => value) -- 2 个变量。很奇怪。
那么如何在不使用case 的情况下在map 中指定Tuple2(或任何其他类型)类型的变量?
更新 2:
这有什么问题?
Map((1, "111"), (2, "222")).map( ((x,y):Tuple2[Int, String]) => y)——错误
Map((1, "111"), (2, "222")).map( ((x):Tuple2[Int, String]) => x._2) -- 好的
【问题讨论】:
-
只有一个
Tuple2[Int, String]类型的变量。 map 有签名def map[B](f: (A) ⇒ B): Map[B]——它接受一个函数,该函数接受 A 类型的 one 变量并产生 B 类型的 one 输出变量(x => x._2就是这样的一个例子函数,而(key, value) => value不是) -
@om-nom-nom,
(key, value)-- 是 Tuple2 类型的一个变量。 -
如果那是真的
List(1,2,3,4).reduce((x,y) => x + y)就不可能了 -
@MariusKavansky,om-nom-nom 100% 正确。相信我。
-
那么为什么不使用
a.map { x => val (key, value) = x; value }来解构它们(正如 om-nom-nom 所说)。是的,它比您希望的更冗长,但它具有相同的意图。另外,我很好奇为什么“案例”是不可能的,因为它似乎符合人们的预期。
标签: scala