15

基本的に、特定のリスト内のキーのマップから一連の値を取得する必要があります (キーが指定された順序で)。

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

私が即興で演奏できた最高のものはfoldRight終わりましたks

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

標準ライブラリまたは短いコードでこれを行うより便利な方法はありますか?理想的には似たようなものですkv getVals ksか? :)

もちろん、質問はそれほど重要ではありません。良いスタイルを模索するだけです。

4

2 に答える 2

28

または:

ks collect kv

結果は、キーが ks にある kv のすべての値で構成されます。

(関数であることに加えて、Map も PartialFunction です)

于 2013-01-31T19:29:07.230 に答える
21

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

于 2013-01-31T10:16:53.137 に答える