Scala—迭代乘积[K,V]类型的迭代器

Scala—迭代乘积[K,V]类型的迭代器,scala,iterator,Scala,Iterator,我是Scala的新手,我试图了解集体。我有一个示例Scala代码,其中方法定义如下: override def write(records: Iterator[Product2[K, V]]): Unit = {...} 据我所知,这个函数传递了一个参数record,它是Product2[K,V]类型的迭代器。现在我不明白的是,这个产品2是一个用户定义的类,还是一个内置的数据结构。此外,我如何探索Product2的键值对内容,以及如何迭代它们。只是K和V类型的两个值 像这样使用它: write

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

override def write(records: Iterator[Product2[K, V]]): Unit = {...}
据我所知,这个函数传递了一个参数record,它是Product2[K,V]类型的迭代器。现在我不明白的是,这个产品2是一个用户定义的类,还是一个内置的数据结构。此外,我如何探索Product2的键值对内容,以及如何迭代它们。

只是K和V类型的两个值

像这样使用它:

write(列表((1,“1”),(2,“2”))

原型也可以像这样编写:
overridefwrite(记录:迭代器[(K,V)]):Unit={…}

访问
k
类型的
k
值和
v
类型的
v

override def write(records: Iterator[(K, V)]): Unit = {
  records.map{case (k, v) => w(k, v)}
}
只是两个类型为K和V的值

像这样使用它:

write(列表((1,“1”),(2,“2”))

原型也可以像这样编写:
overridefwrite(记录:迭代器[(K,V)]):Unit={…}

访问
k
类型的
k
值和
v
类型的
v

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

Product2很可能是一个内置类,如果您使用的是现代IDE(只需在按住ctrl键的情况下将鼠标悬停在它上面),或者,通过检查文件头——如果没有相关的导入,如
some.custom.package.Product2
,那么它是内置的

什么是Product2及其定义在哪里?利用Scala的以下功能,您可以轻松找到这些信息:

对于内置类,您可以将其视为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
更多信息,请参阅

迭代也没有任何麻烦,例如
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

但请记住,一旦使用了迭代器,它将转换为空状态,并且不能再次使用

Product2很可能是一个内置类,如果您使用的是现代IDE(只需在按住ctrl键的情况下将鼠标悬停在它上面),您可以轻松地检查它,或者,通过检查文件头——如果没有相关的导入,如
some.custom.package.Product2
,它是内置的

什么是Product2及其定义在哪里?利用Scala的以下功能,您可以轻松找到这些信息:

对于内置类,您可以将其视为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
更多信息,请参阅

迭代也没有任何麻烦,例如
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
但请记住,一旦使用了迭代器,它将转换为空状态,并且不能再次使用