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
이들은 데코레이터이므로 스칼라 또는 Java 콜렉션 인터페이스에 기본 콜렉션을 래핑하기 만합니다. 따라서 .asJava
및 .asScala
호출은 컬렉션을 복사하지 않습니다.
배열
배열은 일정한 JVM 배열로서, 불변 (invariant)으로 취급되며 특별한 생성자와 암시 적 변환을가집니다. new
키워드없이 그들을 구성하십시오.
val a = Array("element")
이제 a
입력이 Array[String]
.
val acs: Array[CharSequence] = a
//Error: type mismatch; found : Array[String] required: Array[CharSequence]
String
은 CharSequence
로 변환 가능하지만 Array[String]
은 Array[CharSequence]
로 변환 할 수 없습니다.
TraversableLike
ArrayOps
암시 적으로 변환하면 다른 컬렉션과 마찬가지로 Array
를 사용할 수 있습니다.
val b: Array[Int] = a.map(_.length)
대부분의 스칼라 컬렉션 ( TraversableOnce
)에는 결과 배열을 생성하기 위해 암시 적 ClassTag
를 사용하는 toArray
메서드가 있습니다.
List(0).toArray
//> res1: Array[Int] = Array(0)
따라서 스칼라 코드에서 TraversableOnce
를 사용하고 배열을 필요로하는 Java 코드로 쉽게 전달할 수 있습니다.
스칼라 및 Java 유형 변환
스칼라는 JavaConverters 객체의 모든 주요 컬렉션 유형 간의 암시 적 변환을 제공합니다.
다음 유형 변환은 양방향입니다.
스칼라 유형 | Java 유형 |
---|---|
반복자 | java.util.Iterator |
반복자 | java.util.Enumeration |
반복자 | java.util.Iterable |
반복자 | java.util.Collection |
변경할 수 있습니다. 버퍼 | java.util.List |
mutable.Set | java.util.Set |
변경할 수 있습니다. 매핑 | java.util.Map |
mutable.ConcurrentMap | java.util.concurrent.ConcurrentMap |
특정 다른 스칼라 컬렉션도 Java로 변환 할 수 있지만 원래 스칼라 유형으로 다시 변환 할 필요는 없습니다.
스칼라 유형 | Java 유형 |
---|---|
순서 | 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)