जावा संग्रह को स्कैला संग्रह में परिवर्तित करना


88

स्टैक ओवरफ्लो से संबंधित प्रश्न नया हशसेट (संग्रह) के बराबर स्काला , मैं जावा संग्रह ( java.util.Listकहना) को स्कैला संग्रह में Listकैसे बदलूं ?

मैं वास्तव में एक जावा एपीआई कॉल को स्प्रिंग में बदलने की कोशिश कर रहा हूं 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( ... ) ) : _ *)

जवाबों:


17

आपका अंतिम सुझाव काम करता है, लेकिन आप इसका उपयोग करने से भी बच सकते हैं jcl.Buffer:

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

ध्यान दें कि scala.collection.immutable.Setडिफ़ॉल्ट रूप से उपलब्ध कराया गया है धन्यवाद Predef.scala


9
यह सुझाव काम नहीं करता है जहाँ मैं टाइप जानकारी रखना चाहता हूँ
oxbow_lakes

127

भविष्य के संदर्भ के लिए: स्केल 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कुछ toSetआवश्यक नहीं है।
राजिश

@Rajish मुझे लगता है कि यह बेहतर है अगर रूपांतरण (देखें स्पष्ट है stackoverflow.com/questions/8301947/... )
krookedking

आप सही हैं, इसका बेहतर उपयोग आयात scala.collection.JavaConverters._
अभिषेक सेनगुप्ता


25

JavaConversions ( रॉबिन्सन का जवाब ) और JavaConverters ( बेन जेम्स का जवाब ) को स्केल 2.10 के साथ चित्रित किया गया है ।

JavaConversions के बजाय उपयोग करें:

import scala.collection.convert.wrapAll._

जैसा कि aleksandr_hramcov द्वारा सुझाया गया है ।

JavaConverters के बजाय उपयोग करें:

import scala.collection.convert.decorateAll._

दोनों के लिए क्रमशः जावा या स्काला में केवल रूपांतरण / कन्वर्टर्स आयात करने की संभावना है, जैसे:

import scala.collection.convert.wrapAsScala._

अद्यतन: ऊपर दिए गए कथन कि JavaConversions और JavaConverters को हटा दिया गया था, गलत प्रतीत होता है। स्केल 2.10 में कुछ पदावनत संपत्तियां थीं, जिसके परिणामस्वरूप उन्हें आयात करते समय पदावनति की चेतावनी दी गई थी। इसलिए यहां पर वैकल्पिक आयात केवल एलियास ही लगता है। हालांकि मैं अभी भी उन्हें पसंद करता हूं, क्योंकि IMHO के नाम अधिक उपयुक्त हैं।


आप क्यों कहते हैं कि JavaConversions और JavaConverters को पदावनत किया जाता है? वर्तमान दस्तावेज़ीकरण में 2.11.8 दोनों को पदावनत के रूप में चिह्नित नहीं किया गया है और उनके पास 'डेकोरेट' या 'रैपऑल' का संदर्भ भी नहीं है, जो बताते हैं कि यह नया और पसंदीदा उपयोग है।
जोस्ट डेन बोअर

@ जोस्टडेनबॉयर लगता है कि स्कैला 2.10 में वहां कुछ पदावनत सज्जाकार थे , हालाँकि उन्हें लगता है कि स्कैला 2.11 के साथ फिर से हटा दिया गया है।
स्टेमप्लेयर

14

आप इस उत्कृष्ट पुस्तकालय का भी पता लगाना चाहते हैं: स्कैलाज-संग्रह जिसमें जावा और स्काला संग्रह के बीच दो-तरफा रूपांतरण है। आपके मामले में, java.util को बदलने के लिए। स्केला लिस्ट में आप यह कर सकते हैं:

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala

1
वह पुस्तकालय अब तक की सबसे बड़ी चीज है। वास्तव में वास्तव में अच्छी तरह से काम करता है।
माइकल निले

6
कुछ वर्षों के बाद इसे फिर से देखना, स्काला के जावाकोवर्टर्स जाने का रास्ता है।
सूर्यावरपापू

4

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

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

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

यह एक महान जवाब है और मेरी समस्या को हल किया है। इंटरनेट पर बताए गए अधिकांश तरीके सिर्फ java.util.List [java.lang.Long] को scala.collection.immutable.List [java.lang.Long] में परिवर्तित करते हैं। इसलिए इस विधि ने मुझे इसे scala.collection.immutable.List [scala.Long] में बदलने के लिए काम किया
ajkl

2

आप सेट को मानकीकृत करने के लिए inArray कॉल में टाइप जानकारी जोड़ सकते हैं:

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

यह बेहतर हो सकता है क्योंकि संग्रह पैकेज स्काला 2.8 के लिए एक प्रमुख कार्य के माध्यम से जा रहा है और scala.collection.jcl पैकेज दूर जा रहा है


1

आप जावा संग्रह को एक सरणी में बदल सकते हैं और फिर उससे एक स्काला सूची बना सकते हैं:

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

2
यह बहुत अच्छा नहीं है क्योंकि मेरा java.util.List एक जावा एपीआई से एक पैराड्राइज्ड सूची के रूप में वापस आ रहा है (इसलिए एपीआई के लिए मेरी कॉल java.util। लिस्ट <स्ट्रिंग> प्राप्त करता है) - मैं इसे चालू करने की कोशिश कर रहा हूं एक
स्कैच में

1

इस समस्या को हल करने का एक और सरल तरीका:

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