سؤال

كيفية تحويل scala scala.List إلى جافا java.util.List?

هل كانت مفيدة؟

المحلول

قائمة SCALA وقائمة Java هي وحوشان مختلفة، لأن السابق ثابت وغير قابل للتغيير. لذلك، للوصول من واحد إلى آخر، عليك أولا تحويل قائمة 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 في هذا المثال ليست ضرورية إذا كان النوع المتوقع هو جافا List, ، نظرا لأن التحويل ضمني، كما يتضح من السطر الأخير.

نصائح أخرى

لست متأكدا لماذا لم يتم ذكر ذلك من قبل ولكن أعتقد أن الطريقة الأكثر بديهية هي استدعاء 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]

اذا أنت لا تريد تحويلات السيطرة CO ودع مترجم يصنع ضمنية اعمل لاجلك:

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]

الأمر متروك لك كيف تريد التحكم في التعليمات البرمجية الخاصة بك.

الأسئلة القديمة الجميلة، على الرغم من أنني سأجيب، بالنظر إلى إهمال معظم الاقتراحات.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

تحديث

مع 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]

بدءا 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]

للدعوات الفردية، القيام بذلك باليد قد يكون أبسط الحل:

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

أنا لم قياس الأداء.

فقط القيام به كما هو مقترح أعلاه ينتج قائمة ثابتة حتى على جانب جافا. حل العمل الوحيد الذي وجدته هو:

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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top