[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
ここでは、if式を使用して条件分岐する方法を説明します。
記事で説明する例文では、以下のPersonクラスを使用して説明します。
case class Person(name: String, isMarried: Boolean)
if式の書き方
if式は以下の構文で記述します。
if(条件) 式1 else 式2
「条件」がtrueの場合は「式1」を評価し、falseの場合は「式2」を評価します。
式1、式2は、1つの式を記述または、括弧()、波括弧{}で囲んだ式を記述します。
これは式1、式2には、式またはブロックを指定することを意味しています。
式とブロックの詳細については、以下の記事を参照してください。
以下の関数は、結婚している場合と結婚していない場合で条件分岐する例です。
def greeting(person: Person): Unit = if(person.isMarried) println("Hello Mrs. " + person.name + ".") // 結婚している場合 else println("Hello Miss " + person.name + ".") // 結婚していない場合
関数を呼び出してみます。
greeting(Person("Mei", true)) greeting(Person("Himari", false))
実行結果は、以下のようになります。
Hello Mrs. Mei. Hello Miss Himari.
if式は値を返す
if式はその名の通り式のため値を返します。
if式が返す値は、「if式の書き方」で説明した式1、式2を評価した値です。
以下の例では、if式の値を返す関数「getHonorificName」を定義しています。
関数内のif式は、Person.isMarriedがtrueの場合は名前に「Mrs.」をつけた値、falseの場合は「Miss」をつけた値を返します。
def getHonorificName(person: Person): String = val honorific: String = if(person.isMarried) "Mrs." // 結婚している場合 else "Miss" // 結婚していない場合 honorific + " " + person.name
定義した関数を呼び出してみます。
println("Hello " + getHonorificName(Person("Mei", true)) + ".") println("Hello " + getHonorificName(Person("Himari", false)) + ".")
実行結果は、以下のようになります。
Hello Mrs. Mei. Hello Miss Himari.
elseを省略すると返す値がない
if式は値を返しますが、elseがない場合はどうなるでしょうか?
elseがない場合に条件がfalseの場合は、返す値がないためif式の戻り値はUnitになります。
そのため、if式の戻り値を設定する変数の型は、Anyにする必要があります。
以下はREPLで実行した例です。
REPL上でUnitは()と表示されています。
scala> if(false) 123 res0: AnyVal = ()
変数を排除する
前述の例では、if式の値を変数「honorific」に設定していました。
valで定義した変数は、その変数の右辺の式を評価した値と等しいため、変数「honorific」は排除することができます。
以下の例では、前述の例のように変数「honorific」を使用しないで、if式が返す値とPerson.nameを連結した値を返しています。
def getHonorificName(person: Person): String = (if(person.isMarried) "Mrs." else "Miss") + " " + person.name
定義した関数を呼び出してみます。
println("Hello " + getHonorificName(Person("Mei", true)) + ".") println("Hello " + getHonorificName(Person("Himari", false)) + ".")
実行結果は、以下のようになります。
Hello Mrs. Mei. Hello Miss Himari.
Java言語のifとは違う
Scalaのif式は値を返しますが、その一方でJava言語のif文は値を返すことができません。
先程の例をJava言語で記述すると以下のようにif文の外の変数を書き換える必要があります。
javapublic String getHonorificName(Person person) { String honorific; if(person.isMarried()) { honorific = "Mrs."; // 結婚している場合 } else { honorific = "Miss"; // 結婚していない場合 } return honorific + " " + person.name(); }
定義したメソッドを呼び出してみます。
javaSystem.out.println("Hello " + getHonorificName(new Person("Mei", true)) + "."); System.out.println("Hello " + getHonorificName(new Person("Himari", false)) + ".");
実行結果は、以下のようになります。
Hello Mrs. Mei. Hello Miss Himari.
varを使用すればScalaでもJava言語と同じように書くことができますが、Scalaのif式は値を返すのでこのような書き方はあまりしません。
def getHonorificName(person: Person): String = var honorific: String = "" if(person.isMarried) honorific = "Mrs." // 結婚している場合 else honorific = "Miss" // 結婚していない場合 honorific + " " + person.name
関数を呼び出してみます。
println("Hello " + getHonorificName(Person("Mei", true)) + ".") println("Hello " + getHonorificName(Person("Himari", false)) + ".")
実行結果は、以下のようになります。
Hello Mrs. Mei. Hello Miss Himari.