จะแปลง Scala scala.List
เป็น Java ได้java.util.List
อย่างไร?
จะแปลง Scala scala.List
เป็น Java ได้java.util.List
อย่างไร?
คำตอบ:
Scala List และ Java List เป็นสัตว์ร้ายสองชนิดที่แตกต่างกันเนื่องจากในอดีตไม่เปลี่ยนรูปและตัวหลังนั้นไม่แน่นอน ดังนั้นก่อนอื่นคุณต้องแปลงรายการ Scala เป็นคอลเล็กชันที่ไม่แน่นอน
บน Scala 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
ตั้งแต่ Scala 2.8 เป็นต้นไป:
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): _*)
อย่างไรก็ตามasList
ในตัวอย่างนั้นไม่จำเป็นหากประเภทที่คาดไว้คือ Java List
เนื่องจากการแปลงเป็นนัยดังที่แสดงโดยบรรทัดสุดท้าย
scala.collection.JavaConverters
ตั้งแต่ 2.12
ไม่แน่ใจว่าทำไมถึงไม่เคยพูดถึงมาก่อน แต่ฉันคิดว่าวิธีที่ง่ายที่สุดคือการเรียกใช้asJava
เมธอดมัณฑนากรของJavaConvertersโดยตรงในรายการ 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]
สมมติว่าเรามีสิ่งต่อไปนี้List
:
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]
หากคุณไม่ต้องการให้ผู้ร่วมควบคุมการแปลงและปล่อยให้คอมไพเลอร์ทำงานให้คุณโดยปริยาย :
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]
ขึ้นอยู่กับว่าคุณต้องการควบคุมโค้ดของคุณอย่างไร
เริ่มต้นScala 2.13
แพคเกจscala.jdk.CollectionConverters
มีให้asJava
ผ่านทางแมงดาSeq
และแทนที่แพ็คเกจ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]
แม้ว่าฉันจะตอบคำถามเก่า ๆ แต่คำแนะนำส่วนใหญ่เลิกใช้แล้ว
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
ปรับปรุง
ด้วย scala 2.9.2:
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )
ผลลัพธ์
[1, 2, 3]
สำหรับการเรียกใช้ครั้งเดียวการทำด้วยมืออาจเป็นวิธีที่ง่ายที่สุด:
val slist = List (1, 2, 3, 4)
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
ฉันไม่ได้วัดประสิทธิภาพ
เพียงทำตามที่เสนอไว้ข้างต้นจะสร้างรายการที่ไม่เปลี่ยนรูปแม้แต่ในฝั่ง Java ทางออกเดียวที่ฉันพบคือ:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}
เนื่องจาก Scala 2.12.0 JavaConversions เลิกใช้งานแล้ว
ดังนั้นทางออกที่ง่ายที่สุดสำหรับฉันคือ:
java.util.Arrays.asList("a","b","c")
import scala.collection.JavaConverters._
สำหรับ 2.12.4