if式で条件分岐する方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

ここでは、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.isMarriedtrueの場合は名前に「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文の外の変数を書き換える必要があります。

java
public String getHonorificName(Person person) { String honorific; if(person.isMarried()) { honorific = "Mrs."; // 結婚している場合 } else { honorific = "Miss"; // 結婚していない場合 } return honorific + " " + person.name(); }

定義したメソッドを呼び出してみます。

java
System.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.

サイト内検索