Scala.List को java.util.List में कैसे बदलें?


जवाबों:


69

स्केल सूची और जावा सूची दो अलग-अलग जानवर हैं, क्योंकि पूर्व अपरिवर्तनीय है और बाद वाला परिवर्तनशील है। इसलिए, एक से दूसरे में जाने के लिए, आपको पहले स्काला सूची को एक परिवर्तनशील संग्रह में बदलना होगा।

स्केल 2.7 पर:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

स्केल 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रूप से जावा एक है , क्योंकि रूपांतरण अंतर्निहित है, जैसा कि अंतिम पंक्ति द्वारा दर्शाया गया है।


वैल x: java.util.List [इंट] अभी भी अपरिवर्तनीय है। बस जावा में x.add (कुछ) करने की कोशिश करें - यह त्रुटि फेंक देगा
विटामोन

1
@Vitamon यह मेरे लिए कोई त्रुटि नहीं है - मैंने इसे पुष्टि करने के लिए परीक्षण किया।
डैनियल सी। सोबरल

4
scala.collection.JavaConverters२.१२ से
१३:०४

2.12.1 के लिए, जब लूप के लिए एक स्केल के साथ जावा सूची पर तुरंत पुनरावृति होती है, तो मुझे JavaConverters पैकेज में asScalaBuffer () के साथ बेहतर भाग्य मिला है: scala-lang.org/api/2.12.1scala/collection/JavaConverters $ .html
सारा संदेशवाहक

165

यह सुनिश्चित नहीं है कि इसका उल्लेख पहले क्यों नहीं किया गया है, लेकिन मुझे लगता है कि सबसे सहज तरीका यह है कि जावा सूची के asJavaडेकोरेटर विधि को सीधे स्कैला सूची में शामिल किया जाए:

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]

6
इसके लिए आपको कुछ निहित जादू पर निर्भर होने के बजाय स्पष्ट होना चाहिए जो कुछ समय के लिए अवांछित हो सकते हैं।
कामिल लेलोनेक

यदि जावा कोड में बाद के उपयोग के लिए सूची को क्रमबद्ध करने पर यह समस्या उत्पन्न करता है ... तो इसका परिणाम होता है ClassNotFoundException: scala.collection.convert.Wrappers। Arrays.asList (foo: _ *) इस मामले में काम करता है।
मोहन

मुझे इस पृष्ठ पर हर बार मुझे स्कैला में जावा का उपयोग करने की आवश्यकता है। दुर्भाग्य से वहाँ कोई रास्ता नहीं है मुझे ".सजावा" के लिए उचित आयात सुझाव सुझाएं (
mulya

24

पिछले उत्तरों को समेटने के लिए

यह मानते हुए कि हमारे पास निम्नलिखित हैं 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]

यह आपके ऊपर है कि आप अपने कोड को कैसे नियंत्रित करना चाहते हैं।


8

शुरू 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]

7

बहुत पुराने सवाल, हालांकि मैं जवाब दूंगा, दिया गया है लेकिन अधिकांश सुझावों को हटा दिया गया है।

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
प्रयागपाद

5

अपडेट करें

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]

1

एकल आह्वान के लिए, इसे हाथ से करना सबसे सरल उपाय हो सकता है:

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

मैंने प्रदर्शन को नहीं मापा।


0

जैसा कि ऊपर प्रस्तावित किया गया है, जावा पक्ष पर भी अपरिवर्तनीय सूची तैयार करता है। केवल एक ही समाधान मैंने पाया है:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

0

चूंकि Scala 2.12.0 JavaConversions को हटा दिया गया है।

तो मेरे लिए सबसे सरल उपाय था:

java.util.Arrays.asList("a","b","c")

1
यह उत्तर यह नहीं समझाता है कि एक स्केला सूची को जावा सूची में बदलने के लिए इसका उपयोग कैसे करें। Arrays.asList भी समस्याग्रस्त हो सकता है क्योंकि यह एक Arrays.ArrayList देता है जो कि एक resizable सूची नहीं है जो कुछ अप्रत्याशित त्रुटियों का कारण बन सकती है यदि आपको लगता है कि आपके पास एक उपयोग है।
पूहलेन

1
import scala.collection.JavaConverters._पदावनति सत्य है, २.१२.४ के लिए है
प्रयागपाद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.