アウトプットしないと死ぬ病

Scalaの個人メモ帳

Scalaの例外の基本

基本的なことですが、例外が発生した場合、後続の処理がどうなるのか

きちんと見ていきます。

3つのメソッドtestA, testB, testCを作成して

それぞれ下記のメソッドを呼び出します。

そしてtestCでは例外を発生されます。

testA -> testB -> testC(例外発生!)

実際のコードはこんな感じです。

import scala.util.{Failure, Success, Try}

// testAメソッドを呼ぶ
val result = Try {
  testA
 println("ここは呼ばれません!!")
}

// 例外があった場合はエラーメッセージを表示
result match {
  case Success(e) => println("Success!!")
  case Failure(e) => println(e)
}

// testBメソッドを呼ぶ
def testA: Unit = {
  println("Here is testA method")
  testB
 println("ここは呼ばれません!!")
}

// testCメソッドを呼ぶ
def testB: Unit ={
  println("Here is testB method")
  testC
 println("ここは呼ばれません!!")
}

// 例外発生!
def testC: Unit = {
  println("Here is testC method")
  throw new Exception ("Exception")
  println("ここは呼ばれません!!")
}

結果はこんな感じになります。

Here is testA method
Here is testB method
Here is testC method
result: scala.util.Try[Unit] = Failure(java.lang.Exception: Exception)
java.lang.Exception: Exception

ここで注目して欲しいのは、testCメソッドで例外発生後は

ここは呼ばれません!!

が結果に表示されていませんね。

例外がスローされると後続の処理は実行されないんですね。

「あれー、でも例外発生時も後続処理したいんだけどなぁー」

って時どうするか!

そこでtry,catchの登場です!

続く。

Scalaの例外処理についてのメモ!

まずScalaでは例外クラスはJavaと同じクラスが使われています。

なのでScalaで例外が発生したり、例外の処理がしたい場合なんかは

Javaのドキュメントを確認してみるとよいです。

Java Platform SE 8

ちなみにみんな大好き!NullPointerExceptionについては下記URLになります。

ご確認ください。

NullPointerException (Java Platform SE 8)

Scalaのcombinationsを覚えた!!

トランプのポーカー(ジョーカー2枚を除く)で手札5枚の全組み合わせをScalaで計算してみましょう。

全52枚のうちから5枚を選び出すということなので、nCr Conbinationを使えば、

52C5 = 2598960 通り

存在することがわかります。

Scalaではそのままcombinationsというメソッドが用意されていますので 簡単に書けてしまいます。

(1 to 52).combinations(5).length
// result
2598960

それにしても組み合わせの数は約260万通りもあるのですね・・・

ScalaのstartsWithを覚えた!!

与えられた文字列がURLなのかどうか簡単にチェックしたい!

http:// か https://で始まればURLと判断しちゃおう、というコードを書く場合

大人しく正規表現を使う手もありますが、

今回は先頭の文字列比較startsWithを使ってみます。

Scalaではこんな感じで書けます。

def isUrl(url:String): Boolean = {
  url.startsWith("http://") || url.startsWith("https://")
}

val urlString1 = "http://www.google.co.jp/"
val urlString2 = "https://www.google.co.jp/"
val urlString3 = "ttps://www.google.co.jp/"

// trueを返す
isUrl(urlString1)
// trueを返す
isUrl(urlString2)
// falseを返す
isUrl(urlString3)

やったぜ。

Scalaのcontainsとexistsの違いを覚えた!!

ScalaでListの要素にある値が存在するかチェックをしたいときありますよね。

そんな時、直感でexistsを使おうとして、「あれ、なんか構文エラー出るぞ?」みたいなことがあるのでメモ。

Scalaで単純に要素の存在チェックをするときはcontainsを使います。

こんな感じ。

scala> List(1,2,3,4,5).contains(1)
// result
true

そして問題のexistsですが、これは「ある条件を満たす要素が存在するか」をチェックするコレクションメソッドです。

例えば、奇数は存在するかチェックしたい場合はこんな感じです。

// 奇数が存在
scala> List(1,2,3,4,5).exists(n => n % 2 != 0)
// result
true

// 奇数が存在しない!
scala> List(1,2,3,4,5).exists(n => n % 2 != 0)
// result
false

実践ドメイン駆動設計を買って読みきるぞという決意表明

買いました。

www.amazon.co.jp

なんと全583ページ!!すごいボリュームです!!

積んでしまわないようにちょっとずつ読んでいこうと思っとります。

まずは目次の写経から(笑)

第1章 DDDへの誘い

第2章 ドメインサブドメイン、境界づけられたコンテキスト

第3章 コンテキストマップ

第4章 アーキテクチャ

第5章 エンティティ

第6章 値オブジェクト

第7章 サービス

第8章 ドメインオブジェクト

第9章 モジュール

第10章 集約

第11章 ファクトリ

第12章 リポジトリ

第13章 境界づけられたコンテキストの統合

第14章 アプリケーション

付録A 集約とイベントソオーシング:A+ES

付録B 参考文献

ふむふむ、各用語については 「聞いたことはあるけど説明しろって言われても難しい」 って感じです。

まずは「第1章 DDDへの誘い」で華麗に誘っていただきましょう! (続く)

Scalaのcollectを覚えた!!

collectというコレクションメソッドを覚えた!!

リストから欲しい値のみ抽出して、その値を変換して取得したいケースに使えますな。

scala> List(1,2,3,4,5).collect{
  case 1 => "One"
  case 3 => "Three"
}
// result
List[String] = List(One, Three)

collect使わないとfilterしてからmapする感じですかね。

scala> List(1,2,3,4,5).filter{n => (n ==1 || n == 3)}.map {
  case 1 => "One"
  case 3 => "Three"
}
// result
List[String] = List(One, Three)