Làm thế nào để chuyển đổi từ scala.List sang java.util.List?


Câu trả lời:


69

Scala List và Java List là hai con thú khác nhau, vì cái trước là bất biến và cái sau là có thể thay đổi. Vì vậy, để chuyển từ cái này sang cái khác, trước tiên bạn phải chuyển đổi Danh sách Scala thành một tập hợp có thể thay đổi.

Trên Scala 2.7:

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

Từ Scala 2.8 trở đi:

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): _*)

Tuy nhiên, asListtrong ví dụ đó là không cần thiết nếu kiểu mong đợi là Java List, vì chuyển đổi là ẩn, như được minh họa ở dòng cuối cùng.


Val x: java.util.List [Int] vẫn là bất biến. Chỉ cần thử trong Java với x.add (cái gì đó) - nó sẽ xuất hiện lỗi
Vitamon

1
@Vitamon Nó không gây ra bất kỳ lỗi nào cho tôi - tôi chỉ thử nghiệm nó để xác nhận.
Daniel C. Sobral

4
Không được ủng hộ scala.collection.JavaConverterstừ ngày 2.12 vào
Jeroen Kransen

đối với 2.12.1, khi lập tức lặp lại Danh sách Java bằng vòng lặp Scala for, tôi đã gặp may mắn hơn với asScalaBuffer () trong gói JavaConverters
Sarah Messer

165

Không chắc tại sao điều này chưa được đề cập trước đây nhưng tôi nghĩ cách trực quan nhất là gọi asJavaphương thức decorator của JavaConverters trực tiếp trên danh sách Scala:

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
Nó cũng yêu cầu bạn phải rõ ràng thay vì phụ thuộc vào một số ma thuật tiềm ẩn có thể không mong muốn một lúc nào đó.
Kamil Lelonek

Điều này gây ra sự cố nếu tuần tự hóa danh sách để sử dụng tiếp theo trong mã Java ... nó dẫn đến ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) hoạt động trong trường hợp này.
Mohan

Tôi đến trang này mỗi khi tôi cần sử dụng Java trong Scala. Đáng tiếc là không có ý tưởng cách gợi ý cho tôi đề nghị nhập khẩu thích hợp cho ".asJava" ((
Mulya

24

Tổng hợp các câu trả lời trước

Giả sử chúng ta có những điều sau List:

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

Nếu bạn muốn rõ ràngnói chính xác những gì bạn muốn chuyển đổi:

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

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

Nếu bạn không muốn đồng kiểm soát chuyển đổi và để trình biên dịch thực hiện công việc ngầm định cho bạn:

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]

Cách bạn muốn kiểm soát mã của mình là tùy thuộc vào bạn.


8

Bắt đầu Scala 2.13, gói scala.jdk.CollectionConverterscung cấp asJavathông qua một ma cô Seqvà thay thế các gói 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

Những câu hỏi khá cũ, mặc dù tôi sẽ trả lời, đưa ra nhưng hầu hết các gợi ý đều không được chấp nhận.

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

Cập nhật

với scala 2.9.2:

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

kết quả

[1, 2, 3]

1

Đối với các lệnh gọi đơn lẻ, thực hiện bằng tay có thể là giải pháp đơn giản nhất:

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

Tôi đã không đo lường hiệu suất.


0

Chỉ làm như đề xuất ở trên sẽ tạo ra danh sách bất biến ngay cả ở phía Java. Giải pháp hoạt động duy nhất mà tôi đã tìm thấy là:

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

0

Kể từ khi Scala 2.12.0 JavaConversions không được dùng nữa.

Vì vậy, giải pháp đơn giản nhất cho tôi là:

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

1
Câu trả lời này không giải thích cách sử dụng điều này để chuyển đổi danh sách scala thành danh sách java. Arrays.
puhlen

1
Không dùng nữa là đúng, có import scala.collection.JavaConverters._cho 2.12.4
Prayagupd
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.