Scala—迭代乘积[K,V]类型的迭代器
我是Scala的新手,我试图了解集体。我有一个示例Scala代码,其中方法定义如下: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
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
但请记住,一旦使用了迭代器,它将转换为空状态,并且不能再次使用