这个while循环代码中的Scala古怪

标签 scala

昨天,这段代码让我很头疼。我通过逐行读取文件来修复它。有任何想法吗 ?

即使文件中的行数大于 1,while 循环似乎也永远不会被执行。

 val lines = Source.fromFile( new File("file.txt") ).getLines;

 println( "total lines:"+lines.size );

 var starti = 1;
 while( starti < lines.size ){
   val nexti = Math.min( starti + 10, lines.size  );

   println( "batch ("+starti+", "+nexti+") total:" + lines.size )
   val linesSub = lines.slice(starti, nexti)
   //do something with linesSub
   starti = nexti
 }

最佳答案

这确实很棘手,我什至会说这是Iterator 中的一个错误。 . getLines返回 Iterator懒惰地进行。所以似乎发生的是,如果你要求 lines.size迭代器遍历整个文件以计算行数。之后,它“筋疲力尽”:

scala> val lines = io.Source.fromFile(new java.io.File("....txt")).getLines
lines: Iterator[String] = non-empty iterator

scala> lines.size
res4: Int = 15

scala> lines.size
res5: Int = 0

scala> lines.hasNext
res6: Boolean = false

你看,当你执行 size 时两次,结果为零。

有两种解决方案,要么强制迭代器进入“稳定”状态,例如 lines.toSeq .或者你忘记了 size并进行“正常”迭代:
while(lines.hasNext) {
  val linesSub = lines.take(10)
  println("batch:" + linesSub.size)
  // do something with linesSub
}

关于这个while循环代码中的Scala古怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770060/

相关文章:

scala - HDFS : java. io.FileNotFoundException : File does not exist: name. _COPYING

jquery - Play 2.0 自动完成反向路由不起作用

scala - Int 是 Scala 中的有序类型吗?

scala - 使用 <<= 定义的 sbt 任务与使用 := that references another setting's . 值定义的任务有何不同?

scala - 为什么 map.size 在 map 不为空时返回 0

scala - 类/对象/特征级别的访问修饰符是什么意思?

scala - 如何在 Scala 中为 TreeSet 分配顺序而不重复我自己

scala - 从SQL Server读取时如何更改以下对象使用的默认时区:spark.read.jdbc

scala - 如何使用 Databricks FileStore 中的文件

android - 如何将 Scala 集成到核心 Android 平台中?