2010-01-06 8 views
12

मैं जावा इटरेटर्स और/या गणनाओं का उपयोग करके स्केल स्क्रिप्ट में पर्यावरण चर खींचने की कोशिश कर रहा था और महसूस किया कि डॉ फ्रेंकस्टीन माता-पिता का दावा कर सकते हैं, इसलिए मैंने इसके बदले बदसूरत पेड़ से निम्नलिखित को हैक किया:जावा गुणों से स्कैला मानचित्र प्राप्त करना

import java.util.Map.Entry 
import System._ 

val propSet = getProperties().entrySet().toArray() 
val props = (0 until propSet.size).foldLeft(Map[String, String]()){(m, i) => 
    val e = propSet(i).asInstanceOf[Entry[String, String]] 
    m + (e.getKey() -> e.getValue()) 
} 

उदाहरण कहा एक ही वातावरण

props.keySet.toList.sortWith(_ < _).foreach{k => 
    println(k+(" " * (30 - k.length))+" = "+props(k)) 
} 
मुद्रित करने के लिए के लिए

कृपया, कृपया चमकाने इस टी $ # घ के बारे में निर्धारित नहीं करते हैं, बस मुझे स्केला मणि कि मुझे विश्वास है कर रहा हूँ इस के लिए मौजूद है दिखाने स्थिति (यानी जावा गुण -> scala.Map), अग्रिम धन्यवाद; @)

+1

स्कैला मणि, आह? Rubyist? –

+0

नहीं, रुबी मेरे लिए बहुत अच्छा है, अनुमान लगाओ कि यह मेरी आंखों को पकड़े हुए शेल्फ पर स्टेन लिपमैन के सी ++ रत्न की प्रति थी। –

उत्तर

7

स्काला 2.7:

val props = Map() ++ scala.collection.jcl.Conversions.convertMap(System.getProperties).elements 

हालांकि कि कुछ typecasting की जरूरत है। मुझे थोड़ा और काम करने दो।

val props = Map() ++ scala.collection.jcl.Conversions.convertMap(System.getProperties).elements.asInstanceOf[Iterator[(String, String)]] 

ठीक है, यह आसान था। मुझे 2.8 अब पर काम करते हैं ...

import scala.collection.JavaConversions.asMap 
val props = System.getProperties() : scala.collection.mutable.Map[AnyRef, AnyRef] // or 
val props = System.getProperties().asInstanceOf[java.util.Map[String, String]] : scala.collection.mutable.Map[String, String] // way too many repetitions of types 
val props = asMap(System.getProperties().asInstanceOf[java.util.Map[String, String]]) 

शब्दाडंबर, ज़ाहिर है, आयात के एक जोड़े के साथ कम किया जा सकता। सबसे पहले, ध्यान दें कि Map 2.8 पर एक परिवर्तनीय मानचित्र होगा। चमकदार तरफ, यदि आप मानचित्र को वापस कनवर्ट करते हैं, तो आपको मूल वस्तु मिल जाएगी।

अब, मुझे कोई संकेत नहीं है कि PropertiesMap<Object, Object> लागू करता है, यह देखते हुए कि जावाडॉक्स स्पष्ट रूप से बताते हैं कि कुंजी और मान String हैं, लेकिन वहां आप जाते हैं। टाइपकास्ट करने से यह निहित विकल्प बहुत कम आकर्षक बनाता है। यह मामला है, विकल्प उनमें से सबसे संक्षिप्त है।

संपादित

स्काला 2.8 बस जो कि कोड विवादास्पद का सबसे बनाता है Properties से mutable.Map[String,String] को एक अंतर्निहित रूपांतरण, हासिल कर ली।

+0

एक साइड नोट के रूप में, यह पहली बार है जब मैं जावा <-> स्कैला संग्रह रूपांतरण करता हूं। आखिरी बार मैंने कोशिश की कि मैं इसे काम करने के लिए पर्याप्त अनुभव नहीं कर रहा था। और न केवल मुझे अपनी पिछली हार को दूर करने का मौका मिला, लेकिन मुझे बहुत रुचि की यह विशेष समस्या मिलती है, क्योंकि अब मैं खुद को ढूंढता हूं और फिर सिस्टम गुणों को समझता हूं! –

+0

धन्यवाद डैनियल, मैं आपका जवाब बाद में उचित रूप से देखूंगा। मुझे इस विषय में आपकी रुचि को उकसाया गया है। –

+0

@ डैनियल, मुझे संदेह है कि यह वह रत्न है जिसे मैं ढूंढ रहा था, केवल कलाकारों के बारे में शर्म की बात है, खासकर गुणों को मानचित्र [स्ट्रिंग, स्ट्रिंग] को लागू करना चाहिए। ये रूपांतरण मेरे लिए एक महान खोज हैं। –

4

स्काला में 2.8.1 आप एक अधिक संक्षिप्त तरीके से asScalaMap(m : java.util.Map[A, B]) साथ यह कर सकते हैं:

var props = asScalaMap(System.getProperties()) 

props.keySet.toList.sortWith(_ < _).foreach { k => 
    println(k + (" " * (30 - k.length)) + " = " + props(k)) 
} 
+0

धन्यवाद विटाली, मैंने एस्काला मैप पर एक नज़र डाली और एस्कालामैप का संस्करण भी है जो जावा गुणों के उदाहरण से एक स्केल म्यूटेबल मैप [स्ट्रिंग, स्ट्रिंग]। –

7

स्काला में 2.9.1 इस collection.JavaConversions._ अंदर निहित रूपांतरण के आधार पर हल किया जाता है। अन्य उत्तरों बहिष्कृत कार्यों का उपयोग करते हैं। विवरण here दस्तावेज किए गए हैं। यह उस पृष्ठ के बाहर एक प्रासंगिक स्निपेट है:

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> import collection.mutable._ 
import collection.mutable._ 
scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3) 
jul: java.util.List[Int] = [1, 2, 3] 
scala> val buf: Seq[Int] = jul 
buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3) 
scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2) 
m: java.util.Map[String,Int] = {hello=2, abc=1} 

अपरिवर्तनीय नक्शे के लिए एक परिवर्तनशील नक्शे से हो रही है उस पर toMap बुलाने की बात है।

+0

अद्यतन के लिए धन्यवाद, डैनियल ने इन दोषों का जिक्र करते हुए उनके जवाब में एक संपादन प्रदान किया था। पर्यावरण के लिए विडंबनात्मक रूप से पर्याप्त पहुंच स्कैला 2.10 में और भी सीधा होने वाला है, बस sys.env विधि द्वारा लौटाए गए अपरिवर्तनीय मानचित्र का उपयोग करें। –

+2

बस एहसास हुआ कि यह गुणों के लिए एक स्कैला मैप के लिए एक रूपांतरण था जिसे मैंने पूछा था, हालांकि स्कैला 2.10 में सिस्टम गुणों तक पहुंचने के लिए sys.props विधि भी है। –

+1

डेनियल उत्तर में संपादन स्कैला 2.8 के बारे में है, और यह 2.9 में फिर से बदल गया है ... मुझे पता है कि यह भ्रमित है। – iwein

1

लग रहा है स्काला का नवीनतम संस्करण (2.10.2 इस उत्तर के समय के रूप में) में की तरह, यह करने के लिए पसंदीदा तरीका स्पष्ट .asScalascala.collection.JavaConverters से उपयोग कर रहा है:

import scala.collection.JavaConverters._ 

val props = System.getProperties().asScala 

assert(props.isInstanceOf[Map[String, String]]) 
+0

यह सबसे अच्छा जवाब आईएमओ है। धन्यवाद। – Jabba

4

स्काला 2.10। 3

import scala.collection.JavaConverters._ 

//Create a variable to store the properties in 
val props = new Properties 

//Open a file stream to read the file 
val fileStream = new FileInputStream(new File(fileName)) 
props.load(fileStream) 
fileStream.close() 

//Print the contents of the properties file as a map 
println(props.asScala.toMap) 
+0

हाय सारथ। साइट पर योगदान के लिए धन्यवाद। कोड को पोस्ट करने से थोड़ा अधिक स्पष्टीकरण प्राप्त करने के लिए हम स्टैक ओवरव्लो पर उत्तर पसंद करते हैं। इसे पढ़ने का प्रयास करें [अच्छे उत्तरों को पोस्ट करने के लिए गाइड] (http://stackoverflow.com/help/how-to-answer) अधिक सहायता के लिए :) – starsplusplus

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^