[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.