문제

스택 오버 플로우 질문과 관련이 있습니다 Scala 동등한 New Hashset (컬렉션) , Java 컬렉션을 어떻게 변환합니까 (java.util.List 스칼라 컬렉션으로 말하십시오 List?

실제로 Java API 전화를 SimpleJdbcTemplate, 이는 a java.util.List<T>, 불변의 스칼라로 HashSet. 예를 들어 :

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

이것은 작동하는 것 같습니다. 비판은 환영합니다!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
도움이 되었습니까?

해결책

마지막 제안은 효과가 있지만 사용하지 않을 수도 있습니다. jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

주목하십시오 scala.collection.immutable.Set 기본적으로 감사합니다 Predef.scala.

다른 팁

향후 참조 : Scala 2.8에서는 다음과 같이 수행 할 수 있습니다.

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

set a scala.collection.immutable.Set[String] 금후.

또한 참조하십시오 벤 제임스의 대답 보다 명백한 방법 (JavaconVerters 사용)은 지금 권장되는 것 같습니다.

시연 된 Javaconversions보다 더 명백하고 싶다면 Robinst의 대답, JavaconVerters를 사용할 수 있습니다.

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet

Javaconversions (Robinst의 대답) 그리고 Javaconverters (벤 제임스의 대답)와 함께 더 이상 사용되지 않았습니다 스칼라 2.10.

대신에 Javaconversions 사용:

import scala.collection.convert.wrapAll._

제안한대로 Aleksandr_hramcov.

대신에 Javaconverters 사용:

import scala.collection.convert.decorateAll._

두 가지 모두 변환/변환기를 각각 Java 또는 Scala로만 가져올 가능성도 있습니다.

import scala.collection.convert.wrapAsScala._

업데이트:위의 진술 Javaconversions 그리고 Javaconverters 더 이상 사용되지 않은 것 같습니다. Scala 2.10에는 약간의 더 이상 사용되지 않은 속성이 있었으며, 이로 인해 가져올 때 감가 상각 경고가 발생했습니다. 따라서 여기서 대체 수입은 별칭 일뿐입니다. 나는 여전히 그들을 선호하지만, IMHO 이름이 더 적합하기 때문에.

이 훌륭한 도서관을 탐색 할 수도 있습니다. Scalaj- 수집 Java와 Scala Collections 사이에 양방향 변환이 있습니다. 귀하의 경우, java.util.list를 Scala 목록으로 변환하려면 다음을 수행 할 수 있습니다.

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

ToArray 호출에 유형 정보를 추가하여 세트를 매개 변수로 만들 수 있습니다.

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

컬렉션 패키지가 Scala 2.8의 주요 재 작업을 거치고 Scala.collection.jcl 패키지가 사라져

이 문제를 해결하는 또 다른 간단한 방법 :

import collection.convert.wrapAll._

Java 컬렉션을 배열로 변환 한 다음 Scala 목록을 만들 수 있습니다.

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

시작 Scala 2.13, 패키지 scala.jdk.CollectionConverters 패키지를 대체합니다 scala.collection.JavaConverters/JavaConversions._:

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top