Java List에서 Scala List를 얻는 방법?


133

다음과 같은 List를 반환하는 Java API가 있습니다.

public List<?> getByXPath(String xpathExpr)

아래 스칼라 코드를 사용하고 있습니다.

val lst = node.getByXPath(xpath)

이제 scala 구문 설탕을 다음과 같이 시도하십시오.

lst.foreach{ node => ... }

작동하지 않습니다. 오류가 발생합니다.

value foreach is not a member of java.util.List[?0]

Java List를 Scala List로 변환해야합니다. 위의 상황에서 어떻게합니까?



@ 김 : 나는 특정 질문의 복제로 이것을 닫는 것이 확실하지 않습니다. 스칼라 2.7에 대한 특정 질문과 scala.collection.jcl 패키지는 더 이상 스칼라 2.8 및 2.9에 존재하지 않습니다.
Ken Bloom

답변:


177

편집 : 이것은 2.12.0부터 더 이상 사용되지 않습니다. JavaConverters대신 사용하십시오 . (@Yaroslav의 코멘트)

스칼라 2.8 부터이 변환은 다음을 사용하여 언어에 내장되었습니다.

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

공장. asScala작동하지 않았다


13
2.10.4에서 scala.collection.JavaConverters._를 가져와야했습니다. 그렇지 않으면 "Scala가 java.util.List [String]의 멤버가 아니기 때문에 값이"있습니다.
dranxo

11
JavaConversions2.12.0부터 사용되지 않습니다. JavaConverters대신 사용하십시오 .
Yaroslav

4
2.13.x의 경우 import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

이것을 위해 편리한 스칼라 객체가 있습니다 -scala.collection.JavaConverters

asScala다음과 같이 가져 오기를 수행 한 후 수행 할 수 있습니다 .

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

이를 통해 스칼라의 Buffer표현을 통해 달성 할 수 있습니다 foreach.


7
JavaConverters는 변환을 명시 적으로 만들고 혼란 스러울 수있는 실수로 변환하는 것을 피하기 때문에 JavaConversions보다 선호되어야합니다. (즉, 정답입니다)
Mark

scala 2.13부터이 클래스는 더 이상 사용되지 않습니다. 대신 scala.jdk.CollectionConverters를 사용하십시오.
dev-null

9

Java로 작성된 답변을 찾고 있었고 놀랍게도 깨끗한 솔루션을 찾을 수 없었습니다. 잠시 후 다른 사람이 Java 구현을 찾고있는 경우를 대비하여 여기에 추가하기로 결정했습니다 (스칼라에서도 작동한다고 생각하십니까?).

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Java List<ClassA>를 Scala 로 변환해야하는 경우 List[ClassB]다음을 수행해야합니다.

1) 추가

import scala.collection.JavaConverters._

2) 사용 방법 asScala, toList다음map

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) 매개 변수로 ClassB받는 생성자에 다음을 추가하십시오 ClassA.

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}

6

scala 2.8.1부터 JavaConverters._ asScala 및 asJava 메소드를 사용하여 스칼라 및 Java 콜렉션을 변환 하는 데 사용합니다.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

전환 관계 스칼라 문서 사이트 참조


6

Java 목록을 스칼라 목록으로 변환하는 바로 가기

import scala.collection.JavaConverters._

myjavaList.asScala.toList

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.