Làm thế nào để chuyển đổi Scala's scala.Listthành Java java.util.List?
Làm thế nào để chuyển đổi Scala's scala.Listthà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, 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.
scala.collection.JavaConverterstừ 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 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]
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.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]
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