【问题标题】:Scala and case classesScala 和案例类
【发布时间】:2016-11-03 14:32:25
【问题描述】:

我正在读取一个文件,并将行号附加到每个文件。下面是一个方便这个例子的列表:

val testList: List[String] = List("Dont", "Do", "It")

val output: List[(String, Int)] = (testList.zipWithIndex)

使用 ._1 和 ._2 访问器时,我的程序有点代码味道。我创建了:

case class File(line: String, lineNum: Int)

但是,我知道如何充分利用这个案例类的唯一方法是使用以下内容:

val fileOutput: List[File] = for{(line, lineNum) <- output} yield{File(line, lineNum)}

我的问题:为什么我不能这样做?

val output: List[File] = (testList.zipWithIndex)

为了使用案例类,我有点厌倦了对我的文件进行两次传递。

提前致谢

【问题讨论】:

    标签: scala


    【解决方案1】:

    如果您尝试 Scala REPL 中的最后一行,您会明白为什么它不起作用:

    scala> val output: List[File] = testList.zipWithIndex
    <console>:13: error: type mismatch;
     found   : List[(String, Int)]
     required: List[File]
           val output: List[File] = testList.zipWithIndex
    

    这个错误意味着testList.zipWithIndex 的类型为(String, Int),而不是File。您只是在这里遗漏了一步,即将行/索引元组列表映射到File 列表:

    scala> testList.zipWithIndex.map { case (line, index) => File(line, index) }
    res0: List[File] = List(File(Dont,0), File(Do,1), File(It,2))
    

    【讨论】:

      【解决方案2】:

      如果您使用Iterators,您可以避免多次通过(因为它们很懒惰),例如

      for ((line, lineNum) <- testList.iterator.zipWithIndex) yield File(line, lineNum)
      

      【讨论】:

      • 工作,但必须在最后添加 .toList,抱怨类型不匹配。谢谢!
      【解决方案3】:

      我认为您所需要的只是将元组映射到您的案例类的实例中。

      case class FileLine(line: String, lineNum: Int)
      
      val testList: List[String] = List("Dont", "Do", "It")
      val contents = testList.zipWithIndex.map{case (t,n) => FileLine(t,n)}
      // contents: List[FileLine] = List(FileLine(Dont,0), FileLine(Do,1), FileLine(It,2))
      

      【讨论】:

      • testList.zipWithIndex.map(FileLine.tupled) 更短
      【解决方案4】:

      您还可以在testList.zipWithIndex.map((File(_, _)).tupled) 的其他答案中简化匿名函数{ case (line, index) =&gt; File(line, index) }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 2017-02-25
        相关资源
        最近更新 更多