2013-01-31 17 views
10

基本的には、指定されたリスト内のキーのために、同じ順序キーが与えられたマップの値を取得する必要があります。Scalaのキーのリストを与えられたマップからの値の取得

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」のほうがよいでしょうか? foldRightはList.scalaの再帰によって実装されている反面、反復処理によって実装されているので、これはもっと良いスタイルになると思います。 –

+0

答えは以下です:) – dmitry

答えて

16

使用flatMap:

ks flatMap { k => kv get k } 

またはそれ以上:

ks flatMap (kv get) 

そしてfor内包して:

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

しかし、どれも独自のワンライナーのように簡潔かなどは明らかではありません:-)

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

ただし、これは例外的です。ksにマップkvに定義されていないキーが含まれていると例外が発生する可能性があります。

+3

私の神様、それは 'ks map kv'と同じように動作します。私は盲目です:) – dmitry

+0

マップ自体が関数なので... – dmitry

18

または:

ks collect kv 

結果は、キーがKSであるためにKVのすべての値で構成されています。

(関数以外にもMapは部分関数でもあります)

+1

キーは、不足している可能性があります – dmitry

+1

+1私はこれが得られるほど良いと思います。どのように盲目だったのですか?**私は** Mapを 'PartialFunction'として利用しません。 – Faiz

関連する問題