2011-11-15

List でも "Map#get の返り値でパターンマッチ" 的なことを

List でも MapgetOrElse のようなことや get の返り値でパターンマッチしたいことありませんか?

例えば以下のコードを実行すると java.lang.IndexOutOfBoundsException がスローされます。

val list = List("foo", "bar")
println(list(0))
println(list(2))

list(2) の実行時に例外がスローされるのではなく None が返ってほしいこともあります。

方法は 2通りあります。

1つめは Map にしてしまう方法です。

val list = List("foo", "bar")
val map = list.zipWithIndex.map{case (elem, i) => (i, elem)}.toMap
println(map.get(0))
println(map.get(2))

ちょっとトリッキーな感じはしますが、こうすると getOrElse も使えます。

もう 1つは lift メソッドを使う方法です。

val list = List("foo", "bar")
val f = list.lift
println(f(0))
println(f(2))

1つめのコードのように getOrElse は使えませんが、シンプルに書けます。