Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. case class User(id: Long, name: Option[String])
  2.  
  3. object UserDao {
  4.  
  5. def findById(id: Long): Option[User] = {
  6. if (id % 2 == 0)
  7. User(id, Some("Kaneko"))
  8. else
  9. User(id, None)
  10. }
  11.  
  12. }
  13.  
  14. object Main1 extends App {
  15.  
  16. val userOpt = UserDao.findById(2L)
  17.  
  18. val userLength: Option[Option[String]] = userOpt.map{ user: User =>
  19. user.name.map{ name: String => name.length }
  20. }
  21.  
  22. // Optionは値を持つコンテナ。mapメソッドは関数を使ってコンテナ内の値を書き換えて、コンテナに戻すことができます。
  23. // が、コンテナが入れ子になって不都合な場合があります。この場合だと二重になっています。
  24.  
  25. println(userNameLength) // Some(Some("6"))
  26.  
  27. }
  28.  
  29. object Main2 extends App {
  30.  
  31. val userOpt = UserDao.findById(2L)
  32.  
  33. val userLength: Option[String] = userOpt.flatMap{ user: User =>
  34. user.name.map{ name: String => name.length }
  35. }
  36.  
  37. // flatMapを使うと、中のコンテナ自体を、外のコンテナとして戻せます。そうすると平らになります。英語でflatten。
  38. // flatMapはmapしてflattenするので、flatMapです。
  39.  
  40. /**
  41. * 以下のようにコンテナが、3重でも内側のコンテナを一番の外のコンテナとして戻せます。
  42. * val result: Option[String] = x.flatMap{ a =>
  43. * y.flatMap{ b =>
  44. * z.map{ c => ... }
  45. * }
  46. * }
  47. */
  48.  
  49. println(userNameLength) // Some("6")
  50.  
  51. }
  52.  
  53. object Main3 extends App {
  54.  
  55. /**
  56. * このような機能は便利なのですが、少々ネストが深くて読みづらくなっています。それを解消するために使うのがfor式です。
  57. *
  58. * val result: Option[String] = x.flatMap{ a =>
  59. * y.flatMap{ b =>
  60. * z.map{ c => ... }
  61. * }
  62. * }
  63. */
  64. val userOpt = UserDao.findById(2L)
  65.  
  66. val userNameLength = for {
  67. user <- userOpt
  68. userName <- user.name
  69. } yield userName.length
  70.  
  71. // これは繰り返しのforではありません。flatMap/mapの糖衣構文(for式で書くとコンパイラがflatMap/mapに自動的に変換したバイトコードを生成します)としての機能です。
  72.  
  73. println(userNameLength) // Some("6")
  74.  
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement