2011-11-26 16 views
5

एक जावा घटना लॉगिंग (एनालिटिक्स) पुस्तकालय के लिए एक विधि है कि एक घटना नाम लेता है और उसके बाद इस तरह स्ट्रिंग्स की सूची varargs:एक मानचित्र सपाट स्काला में स्ट्रिंग सूची varargs को

Analytics.event("my event name", "key1", "value1", "key2", "value2" ...) 

मैं अपने घटना एकत्र किया है जैसे

Map("key1" -> "value1", "key2" -> "value2" ...) 

एक मानचित्र के लिए मानकों को अब सूची जहां कुंजी और वैकल्पिक महत्व देता Map समतल और फिर घटना विधि करने के लिए इसे खिलाने के लिए एक तरह से किया जाना चाहिए। मैं Map बदलने एक Tuple के List सूची जैसे कई अनुमान किया है,, लेकिन कहते हैं कि पर .flatten बुला

No implicit view available from (java.lang.String, java.lang.String) => scala.collection.TraversableOnce[B] 

मैं यहाँ क्या याद आ रही है?

उत्तर

6

आप : _* ऑपरेटर का उपयोग कर सकते हैं जावा varargs भी (हमें बताएं!)

+0

धन्यवाद! वैसे ही काम करता है जैसा कि माना जाता है। अंत में ToArray (या ToSeq) को जावा varargs द्वारा आवश्यक प्रारूप में प्राप्त करने के लिए पहले की आवश्यकता थी: _ *। – vertti

6

आप प्रत्येक कुंजी/मूल्य जोड़ी को दो तत्वों के साथ सूची में मैप करने के लिए flatMap का उपयोग कर सकते हैं और फिर इन सूचियों को जोड़ सकते हैं।

scala> Map("k1" -> "v1", "k2" -> "v2") 
res0: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(k1 -> v1, k2 -> v2) 

scala> res0.flatMap { case (k,v) => k::v::Nil } 
res1: scala.collection.immutable.Iterable[java.lang.String] = List(k1, v1, k2, v2) 

एक बार जब आप गए हैं, आपको सिर्फ घटना विधि करने के लिए सूची पारित कर सकते हैं:

def event(name: String, values: String*) {/*...*/} 

val params = Map("key1" -> "value1", "key2" -> "value2") 
val paramsArr = params flatMap {case(k, v) => List(k, v)} toArray 

event("name", paramsArr: _*) 

सुनिश्चित नहीं हैं कि इस के साथ काम करता है कि क्या:

Analytics.event("my event name", res1:_*) 
+0

धन्यवाद। res: _ * Iterable का उत्पादन करेगा और इंटेलिज मुझे बताता है कि यह सीक है जो यहां आवश्यक है। – vertti

1
val m = Map ("key1" -> "value1", "key2" -> "value2", "k3"-> "v3") 
val li = m.map ((e)=> List (e._1, e._2)).flatten.toSeq 
event ("name", li: _*) 
+0

मेरे उत्तर के समान ही, लेकिन 1 घंटे बाद और flatMap के बजाय मानचित्र और फ़्लैटन का उपयोग करना। क्या बात है? –

+0

मैं वापसी हिट करना भूल गया। चूंकि यह एक अलग वाक्यविन्यास का उपयोग करता है, इसलिए मैंने इसे ऑनलाइन रखा है। इसे वोट करने का एक कारण? –

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