[java] Java List에서 Scala List를 얻는 방법?

다음과 같은 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.12.0부터 더 이상 사용되지 않습니다. JavaConverters대신 사용하십시오 . (@Yaroslav의 코멘트)

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

import scala.collection.JavaConversions._

...

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

공장. asScala작동하지 않았다


답변

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

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

import scala.collection.JavaConverters._

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

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


답변

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

JavaConversions.asScalaBuffer(myJavaList).toList()


답변

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))
   }
}


답변

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

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


답변

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

import scala.collection.JavaConverters._

myjavaList.asScala.toList


답변