使用 Iterator 将元组映射到元组
Map tuples to tuples using Iterator
为什么下面的代码不起作用,我如何使用 Iterator
克服它?
def f(str : String) : (String, String) = {
str.splitAt(1)
}
var with_id : Iterator[(String, Int)] = List(("test", 1), ("list", 2), ("nothing", 3), ("else", 4)).iterator
println(with_id.mkString(" "))
val result = with_id map { (s : String, i : Int) => (f(s), i) }
println(result.mkString(" "))
预期输出为:
(("t", "est"), 1) (("l", "ist"), 2) ...
错误:
Error:(28, 54) type mismatch;
found : (String, Int) => ((String, String), Int)
required: ((String, Int)) => ?
val result = with_id map { (s : String, i : Int) => (f(s), i) }
^
问题是 (s : String, i : Int) => (f(s), i)
是一个 Function2
(即一个有两个参数的函数):
scala> (s : String, i : Int) => (f(s), i)
res3: (String, Int) => ((String, String), Int) = <function2>
而 .map
期望 Function1
(以元组作为参数)。
您可以用
定义 Function1
scala> val g = (t: (String, Int)) => (f(t._1), t._2)
g: ((String, Int)) => ((String, String), Int) = <function1>
scala> val result = with_id map g
result: Iterator[((String, String), Int)] = non-empty iterator
但使用更惯用的模式匹配匿名函数似乎更好(至少对我而言)(注意添加的 case
):
scala> val result = with_id map { case (s : String, i : Int) => (f(s), i) }
result: Iterator[((String, String), Int)] = non-empty iterator
with_id.map
需要一个 ((String, Int) => ?)
函数作为输入。也就是说,一个函数以 Tuple
作为输入,而不是两个参数。
你可以这样使用它:
with_id map{ case (s,i) => (f(s), i)} //match the input tuple to s and i
为什么下面的代码不起作用,我如何使用 Iterator
克服它?
def f(str : String) : (String, String) = {
str.splitAt(1)
}
var with_id : Iterator[(String, Int)] = List(("test", 1), ("list", 2), ("nothing", 3), ("else", 4)).iterator
println(with_id.mkString(" "))
val result = with_id map { (s : String, i : Int) => (f(s), i) }
println(result.mkString(" "))
预期输出为:
(("t", "est"), 1) (("l", "ist"), 2) ...
错误:
Error:(28, 54) type mismatch;
found : (String, Int) => ((String, String), Int)
required: ((String, Int)) => ?
val result = with_id map { (s : String, i : Int) => (f(s), i) }
^
问题是 (s : String, i : Int) => (f(s), i)
是一个 Function2
(即一个有两个参数的函数):
scala> (s : String, i : Int) => (f(s), i)
res3: (String, Int) => ((String, String), Int) = <function2>
而 .map
期望 Function1
(以元组作为参数)。
您可以用
定义Function1
scala> val g = (t: (String, Int)) => (f(t._1), t._2)
g: ((String, Int)) => ((String, String), Int) = <function1>
scala> val result = with_id map g
result: Iterator[((String, String), Int)] = non-empty iterator
但使用更惯用的模式匹配匿名函数似乎更好(至少对我而言)(注意添加的 case
):
scala> val result = with_id map { case (s : String, i : Int) => (f(s), i) }
result: Iterator[((String, String), Int)] = non-empty iterator
with_id.map
需要一个 ((String, Int) => ?)
函数作为输入。也就是说,一个函数以 Tuple
作为输入,而不是两个参数。
你可以这样使用它:
with_id map{ case (s,i) => (f(s), i)} //match the input tuple to s and i