Scala - 迭代产品类型的迭代器[K,V]

时间:2015-08-06 16:53:07

标签: scala iterator

我是Scala的新手,我正在努力了解集体。我有一个示例Scala代码,其中的方法定义如下:

override def write(records: Iterator[Product2[K, V]]): Unit = {...}

据我所知,这个函数传递了一个参数 record ,它是Product2 [K,V]类型的迭代器。现在我不明白的是这个 Product2 是一个用户定义的类,还是一个内置的数据结构。此外,如何探索Product2的键值对内容以及如何迭代它们。

2 个答案:

答案 0 :(得分:3)

可能是Product2是一个内置类,你可以轻松检查它是否在现代IDE中(只需按住ctrl并将其悬停在它上面),或者通过检查文件头 - 如果没有相关导入,如some.custom.package.Product2,它是内置的。

什么是Product2及其定义的位置?您可以通过使用Scala ScalaDoc

轻松找到这些内容

enter image description here

如果是内置类,你可以将它视为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类型的Kv类型的V

override def write(records: Iterator[(K, V)]): Unit = {
  records.map{case (k, v) => w(k, v)}
}