Làm thế nào để chuyển đổi Scala's scala.List
thành Java java.util.List
?
Làm thế nào để chuyển đổi Scala's scala.List
thành Java java.util.List
?
Câu trả lời:
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, asList
trong 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.
scala.collection.JavaConverters
từ ngày 2.12 vào
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 asJava
phươ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]
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àng và nó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.
Bắt đầu Scala 2.13
, gói scala.jdk.CollectionConverters
cung cấp asJava
thông qua một ma cô Seq
và 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]
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
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]
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")
import scala.collection.JavaConverters._
cho 2.12.4