我是Scala的新手,我正在努力了解集体。我有一个示例Scala代码,其中的方法定义如下:
override def write(records: Iterator[Product2[K, V]]): Unit = {...}
据我所知,这个函数传递了一个参数 record ,它是Product2 [K,V]类型的迭代器。现在我不明白的是这个 Product2 是一个用户定义的类,还是一个内置的数据结构。此外,如何探索Product2的键值对内容以及如何迭代它们。
答案 0 :(得分:3)
可能是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
请记住,一旦使用了迭代器,它就会转换为空状态,并且无法再次重复使用。
答案 1 :(得分:1)
Product2只是K和V类型的两个值。
像这样使用它:
write(List((1, "one"), (2, "two")))
原型也可以写成:override def write(records: Iterator[(K, V)]): Unit = {...}
要访问k
类型的K
和v
类型的V
。
override def write(records: Iterator[(K, V)]): Unit = {
records.map{case (k, v) => w(k, v)}
}