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。然而,你所拥有的是一个函数,它接受两个参数 ab,而不是一个元组(括号很重要):(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))