سؤال

ذات صلة بسؤال Stack Overflow سكالا يعادل HashSet الجديد (المجموعة) , ، كيف يمكنني تحويل مجموعة جافا (java.util.List قل) في مجموعة Scala List?

أحاول بالفعل تحويل استدعاء Java API إلى الربيع SimpleJdbcTemplate, ، والذي يُرجع أ java.util.List<T>, ، إلى سكالا غير قابل للتغيير HashSet.لذلك على سبيل المثال:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

يبدو أن هذا يعمل.النقد هو موضع ترحيب!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)
هل كانت مفيدة؟

المحلول

والاقتراح الأخير أعمالك، ولكن يمكنك أيضا تجنب استخدام jcl.Buffer:

Set(javaApi.query(...).toArray: _*)

ملاحظة أن يرصد scala.collection.immutable.Set متاحة من قبل بفضل الافتراضي لPredef.scala.

نصائح أخرى

لتكون مرجعا في المستقبل: مع سكالا 2.8، فإنه يمكن أن يتم مثل هذا:

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

وset هو scala.collection.immutable.Set[String] بعد ذلك.

وانظر أيضا بن جيمس الجواب للحصول على أكثر الطريق واضحة (باستخدام JavaConverters)، الذي يبدو أنه أوصى الآن.

إذا كنت تريد أن تكون أكثر وضوحا من أظهر JavaConversions في robinst ل الإجابة ، يمكنك استخدام JavaConverters:

import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet

تحويلات جافا (إجابة روبنست) و JavaConverters (إجابة بن جيمس) تم إهمالها مع سكالا 2.10.

بدلاً من تحويلات جافا يستخدم:

import scala.collection.convert.wrapAll._

كما اقترح alexandr_hramcov.

بدلاً من JavaConverters يستخدم:

import scala.collection.convert.decorateAll._

لكليهما هناك أيضًا إمكانية استيراد التحويلات/المحولات إلى Java أو Scala على التوالي، على سبيل المثال:

import scala.collection.convert.wrapAsScala._

تحديث:البيان فوق ذلك تحويلات جافا و JavaConverters تم إهمالها ويبدو أنها خاطئة.كانت هناك بعض الخصائص المهملة في Scala 2.10، مما أدى إلى ظهور تحذيرات إهمال عند استيرادها.لذا يبدو أن الواردات البديلة هنا هي مجرد أسماء مستعارة.على الرغم من أنني ما زلت أفضّلها، لأن الأسماء IMHO أكثر ملاءمة.

ويمكنك أيضا لاستكشاف هذه مكتبة ممتازة: scalaj جمع التي لديها في اتجاهين التحويل بين مجموعات جافا وسكالا. في قضيتك، لتحويل java.util.List إلى قائمة سكالا يمكنك القيام بذلك:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

ويمكنك إضافة المعلومات اكتب في toArray دعوته لجعل مجموعة أن معلمات:

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

وهذا قد يكون من الأفضل كحزمة مجموعات يمر إعادة صياغة الرئيسية للسكالا 2.8 وحزمة scala.collection.jcl هو <وأ href = "http://www.acooke.org/cute/UsingJavaC0.html" يختلط = "نوفولو noreferrer"> الذهاب بعيدا

وهناك طريقة أخرى بسيطة لحل هذه المشكلة:

import collection.convert.wrapAll._

هل يمكن تحويل مجموعة جافا لمجموعة ثم قم بإنشاء قائمة سكالا من ذلك:

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

وScala 2.13 ابتداء، حزمة scala.jdk.CollectionConverters يستبدل حزم scala.collection.JavaConverters/JavaConversions._:

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top