【问题标题】:Scala - Iterate over an Iterator of type Product[K,V]Scala - 迭代 Product[K,V] 类型的迭代器
【发布时间】:2015-08-06 16:53:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala iterator


    【解决方案1】:

    很有可能 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
    

    但请记住,一旦迭代器被使用,它就会转换为空状态并且不能再次重复使用。

    【讨论】:

      【解决方案2】:

      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)}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2021-04-21
        • 2012-03-08
        • 2013-04-27
        相关资源
        最近更新 更多