Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- case class User(id: Long, name: Option[String])
- object UserDao {
- def findById(id: Long): Option[User] = {
- if (id % 2 == 0)
- User(id, Some("Kaneko"))
- else
- User(id, None)
- }
- }
- object Main1 extends App {
- val userOpt = UserDao.findById(2L)
- val userLength: Option[Option[String]] = userOpt.map{ user: User =>
- user.name.map{ name: String => name.length }
- }
- // Optionは値を持つコンテナ。mapメソッドは関数を使ってコンテナ内の値を書き換えて、コンテナに戻すことができます。
- // が、コンテナが入れ子になって不都合な場合があります。この場合だと二重になっています。
- println(userNameLength) // Some(Some("6"))
- }
- object Main2 extends App {
- val userOpt = UserDao.findById(2L)
- val userLength: Option[String] = userOpt.flatMap{ user: User =>
- user.name.map{ name: String => name.length }
- }
- // flatMapを使うと、中のコンテナ自体を、外のコンテナとして戻せます。そうすると平らになります。英語でflatten。
- // flatMapはmapしてflattenするので、flatMapです。
- /**
- * 以下のようにコンテナが、3重でも内側のコンテナを一番の外のコンテナとして戻せます。
- * val result: Option[String] = x.flatMap{ a =>
- * y.flatMap{ b =>
- * z.map{ c => ... }
- * }
- * }
- */
- println(userNameLength) // Some("6")
- }
- object Main3 extends App {
- /**
- * このような機能は便利なのですが、少々ネストが深くて読みづらくなっています。それを解消するために使うのがfor式です。
- *
- * val result: Option[String] = x.flatMap{ a =>
- * y.flatMap{ b =>
- * z.map{ c => ... }
- * }
- * }
- */
- val userOpt = UserDao.findById(2L)
- val userNameLength = for {
- user <- userOpt
- userName <- user.name
- } yield userName.length
- // これは繰り返しのforではありません。flatMap/mapの糖衣構文(for式で書くとコンパイラがflatMap/mapに自動的に変換したバイトコードを生成します)としての機能です。
- println(userNameLength) // Some("6")
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement