【初心者向け】JavaとScalaを同時にマスターしよう!Vol. 15

こんにちは!ぐちです。

最近続いています基本構文シリーズですが、(1記事ずつが短いのは内緒。笑)今回はmatch式についてご紹介したいと思います。Javaでいうところのswitch文とのことです。

前回のVol.14はこちらからどうぞ。

switch – match

一つの値を元に多重分岐を作ることができるJavaのswitch文ですが、Scalaではmatch式という構文を使うようです。

これまでとは違い、構文名も違いますが、コードをじっくり見れば大した違いも感じられず、理解しやすいのかなと思いました。

Java

まずはJavaですね。実行時パラメータで受け取った値によって、表示結果を変更する処理です。switch文の条件に文字列を指定できるようになったのは、確かJava7からの仕様だったと思います。

public class Main {
    public static void main(String[] args) {
        String param = args.length > 0 ? args[0] : "";
        switch (param) {
            case "salt":
                System.out.println("pepper");
                break;
            case "chips":
                System.out.println("salsa");
                break;
            case "eggs":
                System.out.println("bacon");
                break;
            default:
                System.out.println("huh?");
                break;
        }
    }
}

いつも思いますが、breakの冗長さといったら、たまらないですね。笑

Scala

続きまして、Scalaです。

object Main {
    def main(args: Array[String]): Unit = {
        val param = if(args.length > 0) args(0) else ""
        param match {
            case "salt" => println("pepper")
            case "chips" => println("salsa")
            case "eggs" => println("bacon")
            case _ => println("huh?")
        }
    }
}

Javaと似ているようで、冗長的な部分だったりがなくなっていますね!さすがです。笑

随分とすっきり見えていますし、可読性も高いですよね。特にJavaとの大きな違いは文ではなく式というところですので、これらを副作用のない書き方に変更することができます。if式のときと考え方は同じですね。

object Main {
    def main(args: Array[String]): Unit = {
        val param = if(args.length > 0) args(0) else ""
        val friend =
            param match {
                case "salt" => "pepper"
                case "chips" => "salsa"
                case "eggs" => "bacon"
                case _ => "huh?"
            }
        println(friend)
    }
}

もちろんJavaでも同じような書き方(出力をまとめるという意味)もできますが、副作用のある処理になるのは避けられないので、可読性と処理効率の観点から工夫するということになりますね。

その他違い

Javaのswitch文とScalaのmatch式との大きな違いのうちのひとつとして、breakを明示的に書く必要があるか、暗黙的に付与されているかの差です。Javaではbreakを明示的に書かないと次のcase文の処理が行われてしまいます。Scalaではbreakを書かなくても暗黙的に一つのcaseに付与されるので、コードが冗長的にならずに済みます。

また、大きな違いといえば、JavaのdefaultがScalaでは_として扱われるところもおもしろいですねよ。

では今回はこの辺で。