by shigemk2

当面は技術的なことしか書かない

ListのなかのMapの特定のキーの値のリストを取り出したい人生だった

なんということ…

こういうのがあったとして、

val a = List(Map('id -> 1, 'name -> "hoge"), Map('id -> 2, 'name -> "fuga"), Map('id -> 3, 'name -> "bar"))

こういうのが取り出したい。

List(1, 2, 3)

キーidのリスト。

Mapを使うやつ。

// Mapを使う
val a = List(Map('id -> 1, 'name -> "hoge"), Map('id -> 2, 'name -> "fuga"), Map('id -> 3, 'name -> "bar"))
// あんまり賢くない書き方
val l: List[Any] = List()
a.foldLeft(l){(l, m) => l :+ m.apply('id) }
// わりと良い書き方
a.map(_.apply(id))

とちゅうで思ったけど、Map[Symbol, Any]ってあんまりいけてない。。特にAnyが。idの値はIntじゃないか。なんでAnyになるんですか。

というわけで、case classを使いたい

// case classを使う
case class Member(id: Int, name: String)
val a = List(Member(1, "hoge"), Member(2, "fuga"), Member(3, "bar"))
// あんまり(ry
a.foldLeft(List[Int]()){(l, m) => l :+ m.id }
// 割と良い書き方
a.map(_.id)

この書き方のほうが、List[Int]になってくれて、結構嬉しい。

まとめ

こうしたいときはこう…みたいなのは下の下の戦術であるので、いい加減点ではなく線で考えることを覚えたい。あとは、mapちゃんと使おう…

瓶詰の地獄<瓶詰の地獄> (ビームコミックス)

瓶詰の地獄<瓶詰の地獄> (ビームコミックス)