2013-01-31 31 views
10

में चाबियों की नक्शा दी गई सूची से मूल्य प्राप्त करना मूल रूप से मुझे किसी दिए गए सूची में एक कुंजी के लिए मानचित्र से मानों का एक सेट प्राप्त करने की आवश्यकता होती है (उसी क्रम में कुंजी दी जाती है)।स्कैला

val kv = Map("k3" -> "v3", "k1" -> "v1", "k2" -> "v2") 
val ks = List("k1", "k2") 

सबसे अच्छा मैं तात्कालिक किया जा सकता था है foldRightks से अधिक:

scala> (ks foldRight List[String]()) { (v, a) => kv(v) :: a } 
res7: List[String] = List(v1, v2) 

वहाँ मानक lib में यह करने के लिए किसी भी अधिक सुविधाजनक तरीके या सिर्फ छोटे कोड, आदर्श कुछ एक जैसे kv getVals ks हैं? :)

प्रश्न अच्छी तरह से महत्वपूर्ण शैली की तलाश करने की कोशिश कर रहा है, बस इतना महत्वपूर्ण नहीं है।

+0

'यहाँ एक बेहतर विकल्प नहीं हो foldLeft' हैं (एक समारोह एक मानचित्र होने के अलावा भी एक PartialFunction है)? यह एक बेहतर शैली होगी जो मुझे लगता है, क्योंकि इसे पुनरावृत्ति द्वारा कार्यान्वित किया जाता है जबकि List.scala में रिकर्सन द्वारा फोल्ड राइट लागू किया जाता है। –

+0

उत्तर नीचे दिए गए हैं :) – dmitry

उत्तर

16

उपयोग flatMap:

ks flatMap { k => kv get k } 

या बेहतर:

ks flatMap (kv get) 

और for comprehensions साथ:

for (k <- ks; v <- kv get k) yield v 

लेकिन कोई भी संक्षिप्त या अपने खुद के एक लाइनर के रूप में के रूप में स्पष्ट हैं : :-)

ks map kv 
List("k42") map kv // will barf 

हालांकि, ध्यान दें कि यह असाधारण है - ks में एक अपवाद फेंक सकता है यदि kv मानचित्र में परिभाषित कुंजी नहीं है।

+3

मेरे भगवान, यह 'केएस मैप केवी' की तरह ही काम करता है, मैं बहुत अंधा हूं :) – dmitry

+0

क्योंकि मानचित्र स्वयं ही एक कार्य करता है ... – dmitry

18

या:

ks collect kv 

परिणाम केवी जो के लिए एक महत्वपूर्ण ks में है के सभी मानों से बना है।

+1

ग्रेट, 'संग्रह' सुरक्षित रूप से होता है जब कुंजी गायब हो सकता है – dmitry

+1

+1 मुझे लगता है कि यह उतना अच्छा है जितना यह मिलता है। ** मैं ** 'आंशिक समारोह' होने का उपयोग नहीं करने के लिए ** ** ** कितना अंधा था। – Faiz