Java List से Scala List कैसे प्राप्त करें?


133

मेरे पास एक जावा एपीआई है जो एक सूची देता है जैसे:

public List<?> getByXPath(String xpathExpr)

मैं नीचे दिए गए scala कोड का उपयोग कर रहा हूं:

val lst = node.getByXPath(xpath)

अब अगर मैं scala सिंटैक्स चीनी की कोशिश की तरह:

lst.foreach{ node => ... }

यह काम नहीं करता। मुझे त्रुटि मिली:

value foreach is not a member of java.util.List[?0]

ऐसा लगता है कि मुझे जावा सूची को स्केल सूची में बदलने की आवश्यकता है। उपरोक्त संदर्भ में ऐसा कैसे करें?



@ किम: मुझे यकीन नहीं है कि इसे उस विशेष प्रश्न के डुप्लिकेट के रूप में बंद करना उचित है - कि विशेष सवाल स्काला 2.7 के बारे में बात करता है, और स्कैला.कलेक्टियन.जक्ल पैकेज स्काला 2.8 और 2.9 में अब मौजूद नहीं है।
केन ब्लूम

जवाबों:


177

संपादित करें: ध्यान दें कि यह 2.12.0 के बाद से पदावनत है। JavaConvertersइसके बजाय उपयोग करें । (टिप्पणी @Yaroslav द्वारा)

स्काला 2.8 के बाद से अब यह रूपांतरण भाषा में बनाया गया है:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

काम करता है। asScalaकाम नहीं किया


13
२.१०.४ को मुझे scala.collection.JavaConverters._ आयात करना पड़ा, अन्यथा मुझे "मूल्य asccala java.util का कोई सदस्य नहीं मिला। लिस्ट [स्ट्रिंग]"
१४:२४

11
JavaConversions२.१२.० के बाद से पदावनत हैं। JavaConvertersइसके बजाय उपयोग करें ।
यारोस्लाव

4
2.13.x के लिए, आपको import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou

92

इसके लिए एक आसान स्काला ऑब्जेक्ट है - scala.collection.JavaConverters

आप asScalaनिम्नानुसार आयात और बाद में कर सकते हैं :

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

इससे आपको स्काला के Bufferप्रतिनिधित्व को पूरा करने की अनुमति मिलनी चाहिए foreach


7
JavaConverters को JavaConversions से अधिक पसंद किया जाना चाहिए क्योंकि यह रूपांतरण को स्पष्ट करता है (और भ्रामक रूपांतरणों से बचा जा सकता है)। (यानी, यह सही जवाब है)
मार्क

2.13 स्कैला के बाद से यह वर्ग वंचित है। इसके बजाय scala.jdk.CollectionConverters का उपयोग करें।
देव-नल

9

मैं जावा में लिखे गए उत्तर की तलाश कर रहा था और आश्चर्यजनक रूप से यहाँ कोई साफ समाधान नहीं मिल रहा था। थोड़ी देर के बाद मैं यह पता लगाने में सक्षम था, इसलिए मैंने इसे यहां जोड़ने का फैसला किया अगर कोई और जावा कार्यान्वयन की तलाश में है (मुझे लगता है कि यह स्काला में भी काम करता है?)।

JavaConversions.asScalaBuffer(myJavaList).toList()

9

यदि आपको जावा List<ClassA>को स्कैला में बदलना है List[ClassB], तो आपको निम्नलिखित कार्य करने होंगे:

1) जोड़ें

import scala.collection.JavaConverters._

2) विधियों का उपयोग करें asScala, toListऔर फिरmap

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) एक पैरामीटर के रूप में ClassBप्राप्त करने वाले निर्माता को निम्नलिखित जोड़ें ClassA:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}

6

चूंकि scala 2.8.1 JavaConverters._ asala और asJava तरीकों का उपयोग करके scala और Java संग्रहों को परिवर्तित करने के लिए उपयोग करता है।

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

कनवर्ज़न रिलेशनशिप scala doc साइट देखें


6

जावा सूची को स्कैला सूची में बदलने के लिए शॉर्टकट

import scala.collection.JavaConverters._

myjavaList.asScala.toList

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