Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Javaから始めるscalaっぽい書き方

1,407 views

Published on

OOプログラミング経験者が、
scalaっぽく書くためTipsをハンズオン形式で取り上げました

Published in: Engineering
  • Be the first to comment

Javaから始めるscalaっぽい書き方

  1. 1. scalaっぽい書き方 土井 健司
  2. 2. 想定する参加者 Scalaを触り始めた人 とりあえずJavaっぽくScala書いている Intellij IDEA + scala pluginが入っている ※ 全く触ったことがない方でも、雰囲気は伝わる...はず
  3. 3. 本日のゴール ハンズオン形式でJavaっぽいScalaをScalaっぽく書く
  4. 4. Mainクラス作成 1. File -> New -> Project -> Scala 2. scalikeプロジェクト作成 a. ※ scala SDKを選択、もしくはNewからscala-sdk-2.11.7を選択 3. srcを選択して右クリック→New→scalaクラス 4. name: Main, Kind: Object 5. 中でmainと入力し、保管でenter 6. println(“Hello World!”) 7. mainメソッドを右クリック→Run’Main’
  5. 5. お題(3分) 引数を取得 アカウント: account 予算: budget 予算が0以下でエラー 予算は手数料100円を天引き 出力: ○○さんの予算は○円です
  6. 6. Javaっぽいイメージ
  7. 7. お願い! var -> val
  8. 8. Optionからはじめよう! 例外、null、early exit、全部Option! Some(x), None map filter 取り出し pattern match get, getOrElse
  9. 9. Scalaっぽくなった\(^o^)/
  10. 10. 演習問題1 (3分くらい) 3つ目の引数を追加 期間: weeks 期間は4週までとする 日数に変換する こんにちは○○さん、あなたの予算は○円([days]日)です※ ※ 少し難しい!
  11. 11. Option同士の処理 Option同士の処理 (flatMap) for
  12. 12. 解答例
  13. 13. エラーを区別したい! Noneじゃなくてエラーメッセージを残したい Right(x), Left(e)(あんまり使わない...) right.map right.filter Option -> Right(定石) toRight(SomeThingLeft)
  14. 14. エラーが区別できた\(^o^)/
  15. 15. 演習問題2 (3分くらい) 日割り予算を求めよ budget / days 計算はメソッド化すること 引数は予算と日付 日割り金額が1円以下の場合はエラー private def dailyBudget(...) = {...} ○○さんの日割り予算は〇〇円です
  16. 16. よりよく書くヒント 引数はInt? Option[Int]? OptionでもEitherでも使える汎用さ=Int mapやforで中身を取り出して、意識してIntで書く 返り値はInt? Option? Either? Optionが例外の存在を伝える Optionだから汎用的。エラー文言は呼び出し側で変換すれば良い Option⇔Either等変換の手助けメソッドはどんどん活用
  17. 17. 解答例
  18. 18. Tips 例外を抑制してOption化 scala.util.Try().toOption 関数の引数省略 関数の引数は_で1回ずつ参照可能 eitherはscalazの方がげふんげふん...
  19. 19. 関数型言語の3大要素(諸説あり) Immutable ← やや今日のテーマ 副作用がない ← 今日のテーマど真ん中 (関数は第一級関数)
  20. 20. まとめ 例外、null、early exit→全部Option! 単体: map, filter 複数: for 結果: pattern match, getOrElse エラー: toRight 切り出し: メソッドを汎用的に

×