【问题标题】:How can I convert a Java Iterable to a Scala Iterable?如何将 Java Iterable 转换为 Scala Iterable?
【发布时间】:2010-11-07 13:13:26
【问题描述】:

有没有简单的方法来转换一个

java.lang.Iterable[_]

到一个

Scala.Iterable[_]

【问题讨论】:

    标签: scala scala-java-interop


    【解决方案1】:

    在 Scala 2.8 中,这变得容易多了,并且有两种方法可以实现。一种是显式的(尽管它使用隐含):

    import scala.collection.JavaConverters._
    
    val myJavaIterable = someExpr()
    
    val myScalaIterable = myJavaIterable.asScala
    

    编辑: 自从我写这篇文章以来,Scala 社区已经达成了一个广泛的共识,即JavaConverters 是好的,JavaConversions 是坏的,因为潜在的幽灵行动-一个距离。所以根本不要使用JavaConversions


    还有一个更像是隐含的::)

    import scala.collection.JavaConversions._
    
    val myJavaIterable = someExpr()
    
    for (magicValue <- myJavaIterable) yield doStuffWith(magicValue)
    

    【讨论】:

    • 感谢您更新答案并说明良好做法:)
    【解决方案2】:

    是的,使用隐式转换:

    import java.lang.{Iterable => JavaItb}
    import java.util.{Iterator => JavaItr}
    
    implicit def jitb2sitb[T](jit: JavaItb[T]): Iterable[T] = new SJIterable(jit);
    implicit def jitr2sitr[A](jit: JavaItr[A]): Iterator[A] = new SJIterator(jit)
    

    然后可以很容易地实现:

    class SJIterable[T](private val jitb: JavaItr[T]) extends Iterable[T] {
      def elements(): Iterator[T] = jitb.iterator()
    }
    
    class SJIterator[T](private val jit: JavaItr[T]) extends Iterator[T] {
      def hasNext: Boolean = jit hasNext
    
      def next: T = jit next
    }
    

    【讨论】:

    • 谢谢,我希望在标准 Scala 库中有类似的东西,但正如您所展示的,推出自己的库并不难。
    • 想想这会是多少代码,这太荒谬了!
    • 这将在从 Scala 2.8 开始的标准库中。
    【解决方案3】:

    Scala 2.13 开始,包scala.jdk.CollectionConverters 替换已弃用的包scala.collection.JavaConverters/JavaConversions

    import scala.jdk.CollectionConverters._
    
    // val javaIterable: java.lang.Iterable[Int] = Iterable(1, 2, 3).asJava
    javaIterable.asScala
    // Iterable[Int] = List(1, 2, 3)
    

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 2016-01-21
      • 2013-06-01
      • 1970-01-01
      • 2021-08-24
      • 2012-01-04
      • 1970-01-01
      • 2018-10-09
      • 2015-06-30
      相关资源
      最近更新 更多