scala.List를 java.util.List로 변환하는 방법은 무엇입니까?


답변:


69

Scala List와 Java List는 두 가지 다른 짐승입니다. 전자는 불변이고 후자는 변경 가능하기 때문입니다. 따라서 서로간에 가져 오려면 먼저 Scala List를 변경 가능한 컬렉션으로 변환해야합니다.

Scala 2.7에서 :

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Scala 2.8 이상 :

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

그러나이 asList예제에서 예상되는 유형이 Java List인 경우에는 변환이 암시 적이므로 마지막 줄에서 보여주는 것처럼 필요하지 않습니다 .


val x : java.util.List [Int]는 여전히 변경 불가능합니다. Java에서 x.add (something)로 시도하십시오. 오류가 발생합니다
Vitamon

1
@Vitamon 나에게 오류가 발생하지 않습니다. 확인하기 위해 테스트했습니다.
Daniel C. Sobral 2013 년

4
scala.collection.JavaConverters2.12부터 사용 중단됨
Jeroen Kransen

2.12.1의 경우 Scala for 루프를 사용하여 Java List를 즉시 반복 할 때 JavaConverters 패키지의 asScalaBuffer ()를 사용하는 것이 더 좋습니다. scala-lang.org/api/2.12.1/scala/collection/JavaConverters $ .html
Sarah Messer 19 년

165

왜 이것이 전에 언급되지 않았는지 확실하지 않지만 가장 직관적 인 방법은 Scala 목록에서 JavaConvertersasJava데코레이터 메서드를 직접 호출하는 것입니다 .

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

6
또한 언젠가는 원하지 않을 수도있는 암시 적 마법에 의존하기보다는 명시 적이어야합니다.
Kamil Lelonek 2014

이로 인해 Java 코드에서 후속 사용을 위해 목록을 직렬화하는 경우 문제가 발생합니다. 결과적으로 ClassNotFoundException : scala.collection.convert.Wrappers가 발생합니다. 이 경우 Arrays.asList (foo : _ *)가 작동합니다.
Mohan

Scala에서 Java를 사용해야 할 때마다이 페이지를 방문합니다. 불행히도 ".asJava"에 대한 적절한 가져 오기 제안을 제안 할 방법이 없습니다 ((
mulya

24

이전 답변을 요약하려면

다음이 있다고 가정합니다 List.

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

당신이 싶은 경우에 명시 하고 정확하게 말할 변환 할 무엇을 :

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

이 경우 공동 제어 변환을하지 않으려 및하자 컴파일러를 만들 암시 당신을 위해 일을 :

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

코드를 제어하는 ​​방법은 사용자에게 달려 있습니다.


8

시작 Scala 2.13하면 패키지 scala.jdk.CollectionConvertersasJava포주를 통해 제공 하고 패키지 를 Seq대체합니다 scala.collection.JavaConverters/JavaConversions.

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

7

꽤 오래된 질문이지만 대답 할 것이지만 대부분의 제안은 더 이상 사용되지 않습니다.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
prayagupd

5

최신 정보

스칼라 2.9.2 사용 :

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

결과

[1, 2, 3]

1

단일 호출의 경우 수동으로 수행하는 것이 가장 간단한 솔루션 일 수 있습니다.

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

성능을 측정하지 않았습니다.


0

위에서 제안한대로 수행하면 Java 측에서도 불변 목록이 생성됩니다. 내가 찾은 유일한 해결책은 다음과 같습니다.

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

0

Scala 2.12.0 이후 JavaConversions는 더 이상 사용되지 않습니다.

그래서 가장 간단한 해결책은 다음과 같습니다.

java.util.Arrays.asList("a","b","c")

1
이 답변은 이것을 사용하여 스칼라 목록을 Java 목록으로 변환하는 방법을 설명하지 않습니다. Arrays.asList는 크기 조정이 가능한 List가 아닌 Arrays.ArrayList를 반환하므로 util.ArrayList가 있다고 생각하는 경우 예기치 않은 오류가 발생할 수 있으므로 문제가 될 수 있습니다.
puhlen

1
Deprecation is true, there is import scala.collection.JavaConverters._for 2.12.4
prayagupd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.