Map 中的 find 函数如何在 Scala 中工作?
How does find function in Map work in Scala?
我是 Scala 新手。这是我写的代码。
object Main extends App {
val mp: Map[String, String] = Map[String, String]("a"->"a", "b"->"b", "c"->"c", "d"->"d")
val s: Option[(String, String)] = mp.find((a: String, b: String) => {
if(a == "c" && b == "c") {
true
}
else {
false
}
})
println(s)
}
我收到以下错误。
error: type mismatch;
found : (String, String) => Boolean
required: ((String, String)) => Boolean
我做错了什么?
你需要改变
mp.find((a: String, b: String) =>
要么
mp.find(((a: String, b: String)) =>
或
mp.find( case (a: String, b: String) =>
您编写的是一个需要两个参数的函数,但您只会传入一个参数,即 Pair
(也称为 Tuple2
)。额外的大括号和 case 关键字是指定您只传递一个参数的方式,它是 Pair 的一个实例。
问题是 find 需要一个接受单个参数的函数,在这种情况下是 Tuple2
和 returns Boolean
: ((String, String)) => Boolean
。然而,你所拥有的是一个函数,它接受两个参数 a
和 b
,而不是一个元组(括号很重要):(String, String) => Boolean
.
这是修复它的一种方法。在这种情况下,我使用模式匹配来提取参数:
object Main extends App {
val mp: Map[String, String] = Map[String, String]("a"->"a", "b"->"b", "c"->"c", "d"->"d")
val s: Option[(String, String)] = mp.find{ case(a, b) => a == "c" && b == "c" }
println(s)
}
或者你也可以这样做:
val s: Option[(String, String)] = mp.find(t => t._1 == "c" && t._2 == "c")
两者都会打印:
Some((c,c))
我是 Scala 新手。这是我写的代码。
object Main extends App {
val mp: Map[String, String] = Map[String, String]("a"->"a", "b"->"b", "c"->"c", "d"->"d")
val s: Option[(String, String)] = mp.find((a: String, b: String) => {
if(a == "c" && b == "c") {
true
}
else {
false
}
})
println(s)
}
我收到以下错误。
error: type mismatch;
found : (String, String) => Boolean
required: ((String, String)) => Boolean
我做错了什么?
你需要改变
mp.find((a: String, b: String) =>
要么
mp.find(((a: String, b: String)) =>
或
mp.find( case (a: String, b: String) =>
您编写的是一个需要两个参数的函数,但您只会传入一个参数,即 Pair
(也称为 Tuple2
)。额外的大括号和 case 关键字是指定您只传递一个参数的方式,它是 Pair 的一个实例。
问题是 find 需要一个接受单个参数的函数,在这种情况下是 Tuple2
和 returns Boolean
: ((String, String)) => Boolean
。然而,你所拥有的是一个函数,它接受两个参数 a
和 b
,而不是一个元组(括号很重要):(String, String) => Boolean
.
这是修复它的一种方法。在这种情况下,我使用模式匹配来提取参数:
object Main extends App {
val mp: Map[String, String] = Map[String, String]("a"->"a", "b"->"b", "c"->"c", "d"->"d")
val s: Option[(String, String)] = mp.find{ case(a, b) => a == "c" && b == "c" }
println(s)
}
或者你也可以这样做:
val s: Option[(String, String)] = mp.find(t => t._1 == "c" && t._2 == "c")
两者都会打印:
Some((c,c))