很有可能 Product2 是一个内置类,如果您在现代 IDE 中(只需按住 ctrl 将鼠标悬停在它上面),或者通过检查文件头 - 如果没有相关的导入,您可以轻松检查它,像some.custom.package.Product2,它是内置的。
什么是 Product2,它是在哪里定义的?通过使用 Scala 的ScalaDoc,你可以很容易地找到这些东西:
对于内置类,您可以将其视为 2 个元素的元组(实际上 Tuple2 扩展了 Product2,如下所示),它具有 ._1 和 ._2 访问器方法。
scala> val x: Product2[String, Int] = ("foo", 1)
// x: Product2[String,Int] = (foo,1)
scala> x._1
// res0: String = foo
scala> x._2
// res1: Int = 1
更多信息请参见How should I think about Scala's Product classes?。
迭代也很轻松,例如这里是map 操作:
scala> val xs: Iterator[Product2[String, Int]] = List("foo" -> 1, "bar" -> 2, "baz" -> 3).iterator
xs: Iterator[Product2[String,Int]] = non-empty iterator
scala> val keys = xs.map(kv => kv._1)
keys: Iterator[String] = non-empty iterator
scala> val keys = xs.map(kv => kv._1).toList
keys: List[String] = List(foo, bar, baz)
scala> xs
res2: Iterator[Product2[String,Int]] = empty iterator
但请记住,一旦迭代器被使用,它就会转换为空状态并且不能再次重复使用。