サーチ…


スカラコレクションをJavaコレクションに変換する(逆も同様)

コレクションをJavaメソッドに渡す必要がある場合は、次のようにします。

import scala.collection.JavaConverters._

val scalaList = List(1, 2, 3)
JavaLibrary.process(scalaList.asJava)

JavaコードがJavaコレクションを返す場合は、同様の方法でScalaコレクションに変換できます。

import scala.collection.JavaConverters._

val javaCollection = JavaLibrary.getList
val scalaCollection = javaCollection.asScala

これらはデコレータであることに注意してください。そのため、ScalaやJavaのコレクションインタフェースで基本となるコレクションを単にラップするだけです。したがって、 .asJava.asScalaの呼び出しはコレクションをコピーしません。

配列

配列は、通常のJVM配列であり、それらは不変として扱われ、特殊なコンストラクタと暗黙的な変換を持っています。 newキーワードなしでそれらを構築してください。

 val a = Array("element")

さて型を持つa Array[String]

 val acs: Array[CharSequence] = a
 //Error: type mismatch;  found   : Array[String]  required: Array[CharSequence]

StringCharSequenceに変換可能CharSequenceArray[String]Array[CharSequence]変換できません。

TraversableLike ArrayOpsへの暗黙的な変換のおかげで、他のコレクションと同様にArrayを使用できます。

 val b: Array[Int] = a.map(_.length)

ほとんどのScalaコレクション( TraversableOnce )には、暗黙のClassTagを使用して結果配列を構築するtoArrayメソッドがあります。

 List(0).toArray
 //> res1: Array[Int] = Array(0)

これにより、 TraversableOnceをScalaコードで使いやすくし、配列を必要とするJavaコードに渡すことが容易になります。

スカラとJavaの型変換

Scalaは、JavaConvertersオブジェクト内のすべての主要なコレクション型間の暗黙的な変換を提供します。

以下の型変換は双方向です。

スカラ型 Javaタイプ
イテレータ java.util.Iterator
イテレータ java.util.Enumeration
イテレータ java.util.Iterable
イテレータ java.util.Collection
mutable.Buffer java.util.List
mutable.Set java.util.Set
mutable.Map java.util.Map
mutable.ConcurrentMap java.util.concurrent.ConcurrentMap

特定の他のScalaコレクションもJavaに変換できますが、元のScala型に変換されません。

スカラ型 Javaタイプ
Seq java.util.List
mutable.Seq java.util.List
セット java.util.Set
地図 java.util.Map

リファレンス

JavaコレクションとScalaコレクション間の変換

スカラ関数の関数インタフェース - scala-java8-compat

Scala用のJava 8互換キット。

ほとんどの例はReadmeからコピーされています

scala.FunctionNとjava.util.functionの間の変換

import java.util.function._
import scala.compat.java8.FunctionConverters._

val foo: Int => Boolean = i => i > 7
def testBig(ip: IntPredicate) = ip.test(9)
println(testBig(foo.asJava))  // Prints true

val bar = new UnaryOperator[String]{ def apply(s: String) = s.reverse }
List("cod", "herring").map(bar.asScala)    // List("doc", "gnirrih")

def testA[A](p: Predicate[A])(a: A) = p.test(a)
println(testA(asJavaPredicate(foo))(4))  // Prints false

scala.Optionクラスとjava.utilクラスの間のコンバーターオプション、OptionalDouble、OptionalInt、およびOptionalLong。

import scala.compat.java8.OptionConverters._

    class Test {
      val o = Option(2.7)
      val oj = o.asJava        // Optional[Double]
      val ojd = o.asPrimitive  // OptionalDouble
      val ojds = ojd.asScala   // Option(2.7) again
    }

ScalaコレクションからJava 8ストリームへの変換

import java.util.stream.IntStream

import scala.compat.java8.StreamConverters._
import scala.compat.java8.collectionImpl.{Accumulator, LongAccumulator}


  val m = collection.immutable.HashMap("fish" -> 2, "bird" -> 4)
  val parStream: IntStream = m.parValueStream
  val s: Int = parStream.sum
  // 6, potientially computed in parallel
  val t: List[String] = m.seqKeyStream.toScala[List]
  // List("fish", "bird")
  val a: Accumulator[(String, Int)] = m.accumulate // Accumulator[(String, Int)]

  val n = a.stepper.fold(0)(_ + _._1.length) +
    a.parStream.count // 8 + 2 = 10

  val b: LongAccumulator = java.util.Arrays.stream(Array(2L, 3L, 4L)).accumulate
  // LongAccumulator
  val l: List[Long] = b.to[List] // List(2L, 3L, 4L)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow