当前位置:  开发笔记 > 编程语言 > 正文

在Scala中迭代Java集合

如何解决《在Scala中迭代Java集合》经验,为你挑选了6个好方法。

我正在编写一些使用Apache POI API的Scala代码.我想迭代java.util.Iterator我从Sheet类中获得的行.我想在for each样式循环中使用迭代器,所以我一直在尝试将其转换为原生的Scala集合,但没有运气.

我查看了Scala包装器类/特性,但我看不出如何正确使用它们.如何在不使用详细while(hasNext()) getNext()循环样式的情况下迭代Scala中的Java集合?

这是我根据正确答案编写的代码:

class IteratorWrapper[A](iter:java.util.Iterator[A])
{
    def foreach(f: A => Unit): Unit = {
        while(iter.hasNext){
          f(iter.next)
        }
    }
}

object SpreadsheetParser extends Application
{
    implicit def iteratorToWrapper[T](iter:java.util.Iterator[T]):IteratorWrapper[T] = new IteratorWrapper[T](iter)

    override def main(args:Array[String]):Unit =
    {
        val ios = new FileInputStream("assets/data.xls")
        val workbook = new HSSFWorkbook(ios)
        var sheet = workbook.getSheetAt(0)
        var rows = sheet.rowIterator()

        for (val row <- rows){
            println(row)
        }
    }
}

小智.. 254

从Scala 2.8开始,您所要做的就是导入JavaConversions对象,该对象已经声明了适当的转换.

import scala.collection.JavaConversions._

但这在以前的版本中不起作用.



1> 小智..:

从Scala 2.8开始,您所要做的就是导入JavaConversions对象,该对象已经声明了适当的转换.

import scala.collection.JavaConversions._

但这在以前的版本中不起作用.



2> 小智..:

有一个包装类(scala.collection.jcl.MutableIterator.Wrapper).所以,如果你定义

implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it)

然后它将充当Scala迭代器的子类,因此您可以这样做foreach.


这个答案在Scala 2.8中已经过时了; 见http://stackoverflow.com/questions/2708990/whats-the-new-way-to-iterate-over-a-java-map-in-scala-2-8-0

3> antonone..:

Scala 2.12.0已弃用scala.collection.JavaConverters,因此从2.12.0开始,这样做的方法如下:

import scala.collection.JavaConverters._

// ...

for(k <- javaCollection.asScala) {
    // ...
}

(注意导入,new是JavaConverters,不推荐使用JavaConversions)



4> Daniel Spiew..:

这里的正确答案是定义从Java Iterator到某些自定义类型的隐式转换.此类型应实现foreach委托给底层的方法Iterator.这将允许您将Scala for-loop与任何Java 一起使用Iterator.



5> F. P. Freely..:

对于Scala 2.10:

// Feature warning if you don't enable implicit conversions...
import scala.language.implicitConversions
import scala.collection.convert.WrapAsScala.enumerationAsScalaIterator



6> 小智..:

使用Scala 2.10.4+(可能更早),可以通过导入scala.collection.JavaConversions.asScalaIterator将java.util.Iterator [A]隐式转换为scala.collection.Iterator [A].这是一个例子:

object SpreadSheetParser2 extends App {

  import org.apache.poi.hssf.usermodel.HSSFWorkbook
  import java.io.FileInputStream
  import scala.collection.JavaConversions.asScalaIterator

  val ios = new FileInputStream("data.xls")
  val workbook = new HSSFWorkbook(ios)
  var sheet = workbook.getSheetAt(0)
  val rows = sheet.rowIterator()

  for (row <- rows) {
    val cells = row.cellIterator()
    for (cell <- cells) {
      print(cell + ",")
    }
    println
  }

}

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有