Làm cách nào để có được Danh sách Scala từ Danh sách Java?


133

Tôi có API Java trả về Danh sách như:

public List<?> getByXPath(String xpathExpr)

Tôi đang sử dụng mã scala dưới đây:

val lst = node.getByXPath(xpath)

Bây giờ nếu tôi thử cú pháp scala như:

lst.foreach{ node => ... }

nó không hoạt động. Tôi nhận được lỗi:

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

Có vẻ như tôi cần chuyển đổi Danh sách Java sang Danh sách Scala. Làm thế nào để làm điều đó trong bối cảnh trên?



@Kim: Tôi không chắc việc đóng câu hỏi này là trùng lặp với câu hỏi cụ thể đó - câu hỏi cụ thể đó nói về Scala 2.7 và gói scala.collection.jcl không còn tồn tại trong Scala 2.8 và 2.9.
Ken Bloom

Câu trả lời:


177

EDIT: Lưu ý rằng điều này không được chấp nhận kể từ 2.12.0. Sử dụngJavaConverters thay thế. (bình luận của @Yar Tư)

Scala 2.8 , chuyển đổi này hiện được tích hợp vào ngôn ngữ bằng cách sử dụng:

import scala.collection.JavaConversions._

...

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

làm. asScalađã không làm việc


13
Vào ngày 2.10.4, tôi đã phải nhập scala.collection.JavaConverters._ nếu không tôi đã nhận được "giá trị asScala không phải là thành viên của java.util.List [String]"
dranxo

11
JavaConversionskhông được dùng kể từ 2.12.0. Sử dụng JavaConvertersthay thế.
Yaroslav

4
Đối với 2.13.x, bạn cần import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

Có một đối tượng Scala tiện dụng chỉ cho việc này - scala.collection.JavaConverters

Bạn có thể thực hiện nhập và asScalasau đó như sau:

import scala.collection.JavaConverters._

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

Điều này sẽ cung cấp cho bạn Bufferđại diện của Scala cho phép bạn hoàn thành foreach.


7
JavaConverters nên được ưu tiên hơn JavaConversions vì nó làm cho việc chuyển đổi rõ ràng (và tránh các chuyển đổi ngẫu nhiên có thể gây nhầm lẫn). (Tức là, đây là câu trả lời đúng)
Đánh dấu

kể từ scala 2.13, lớp này cũng không được dùng nữa. Thay vào đó, hãy sử dụng scala.jdk.CollectionConverters.
dev-null

9

Tôi đang tìm kiếm một câu trả lời được viết bằng Java và đáng ngạc nhiên là không thể tìm thấy bất kỳ giải pháp sạch nào ở đây. Sau một thời gian tôi đã có thể tìm ra nó vì vậy tôi quyết định thêm nó vào đây trong trường hợp người khác đang tìm kiếm triển khai Java (tôi đoán nó cũng hoạt động trong Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Nếu bạn phải chuyển đổi Java List<ClassA>sang ScalaList[ClassB] , thì bạn phải làm như sau:

1) Thêm

import scala.collection.JavaConverters._

2) Sử dụng các phương thức asScala, toListvà sau đómap

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

3) Thêm phần sau vào hàm ClassBtạo nhận ClassAtham số:

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

6

Do scala 2.8.1 sử dụng JavaConverters._ để chuyển đổi các bộ sưu tập scala và Java bằng các phương thức asScala và asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

xem trang web tài liệu scala mối quan hệ chuyển đổi


6

Phím tắt để chuyển đổi danh sách java sang danh sách scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.