수색…


스칼라 컬렉션을 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]

StringCharSequence 로 변환 가능하지만 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

참조 :

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