Scala Language
Javaの相互運用性
サーチ…
スカラコレクションを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]
String
はCharSequence
に変換可能CharSequence
、 Array[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 |
リファレンス :
スカラ関数の関数インタフェース - scala-java8-compat
ほとんどの例は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)