How can I convert a Java Iterable to a Scala Iterable?

前端 未结 3 1075
灰色年华
灰色年华 2020-12-13 03:45

Is there an easy way to convert a

java.lang.Iterable[_]

to a

Scala.Iterable[_]

?

相关标签:
3条回答
  • 2020-12-13 04:02

    Starting Scala 2.13, package scala.jdk.CollectionConverters replaces deprecated packages 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)
    
    0 讨论(0)
  • 2020-12-13 04:12

    In Scala 2.8 this became much much easier, and there are two ways to achieve it. One that's sort of explicit (although it uses implicits):

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

    EDIT: Since I wrote this, the Scala community has arrived at a broad consensus that JavaConverters is good, and JavaConversions is bad, because of the potential for spooky-action-at-a-distance. So don't use JavaConversions at all!


    And one that's more like an implicit implicit: :)

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

    0 讨论(0)
  • 2020-12-13 04:26

    Yes use implicit conversions:

    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)
    

    Which can then be easily implemented:

    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
    }
    
    0 讨论(0)
提交回复
热议问题