本日のお裾分け

日々の開発で得た知識をシェアします。Java/Scala/Ruby/javascript

Scalaの制御構造、Javaとの違い(if/forのみ)

Scalaの制御構造が難しかったので、Javaとの比較をしながら確認していきます。
今回は3つの制御構造を初回しますが、どれも結果値(Javaでいう戻り値)があることが特徴です。

目次
 1.if式
 2.for式

1.if式
Scalaのif式は値を返します。なので、分岐結果をそのまま他の処理に渡すことができます。

object Main extends App{
   val str1 = "str1"
   val str2 = ""
   val blank = "blank"

   println(if(!str1.isEmpty) str1 else blank)
   println(if(!str2.isEmpty) str2 else blank)
} 

Javaのif文は戻り値がないため、以下の書き方はコンパイルエラーとなります。
System.out.println(if(!str1.isEmpty()) str1 else "blank");//コンパイルエラー!
なので、分岐結果に処理を書くか、一時変数に入れておく必要があります。

public class Main {
   public static void main(String[] args){
   String str1 = "str1";
   String str2 = "";

   //分岐結果に処理を書くか    
   if(!str1.isEmpty()) System.out.println(str1);
   else System.out.println("blank");
   //一時変数に結果を入れておく
   String result;
   if(!str2.isEmpty()) result = str2;
   else result = "blank";
   System.out.println(result);
   }
}


 Scalaが目指している関数型プログラミングの世界では、「関数とは値を結果として出す式を定義したもの」という考え方があるらしく、その結果がif式に結果値があるという仕様らしいです。
 関数型プログラミングの思想についてはまだ理解できていないので、今後も理解が深まったら記事にしていきますね。

次。for式。
2.for式

 こいつも結果値(Javaでいう戻り値)をもちます。
 Scalaでは、ジェネレーター(「<-」←これ)を使うことで、Javaでいうところの拡張for文(for-each文)みたいな書き方ができます。
 こんな感じです。

object Main extends App{
   val strList = List("a","b","c")    

   for(str <- strList)
       println(str)
}

 この時、println()メソッドが使ってるstrが、for式の結果値ですね。
 気を付けたいのは、Javaの拡張for文でコレクションを一時変数に詰め込み、処理を繰り返しますが、Scalaで詰め込む変数はvalです。
 よって、varではないので、再代入ができなく、以下の コードだとstr = “x”でコンパイルエラーが発生します。

object Main extends App{
   val strList = List("a","b","c")    

   for(str <- strList){
       str = "x" //コンパイルエラー
       println(str)
   }
}


 ちなみに、Scalaではfor式の結果値を格納して新しいコレクションを作れるyieldというキーワードがあります。
 for <節> yield <本体>という構文で書くことで、yieldキーワードの次に指定した値がコレクションになってfor式の結果値となるようです。

object Main extends App{
 val strList = List("Anthrax","Mettalica","Megadeth")    
 val forLineLengths =
  for(str <- strList)yield str.length

 println(forLineLengths)
}

上の例だと、yield str.lengthと指定しているので、strListからstrが取り出された後、文字数をコレクション化して返しています。
実行結果⇓
List(7, 9, 8)

 Scalaが目指している関数型プログラミングの世界では、「関数とは値を結果として出す式を定義したもの」という考え方があるらしく、その結果がif式に。。。略

 関数型プログラミングって何?という疑問からScalaを初めてみましたが、副作用がないメソッド、final変数中心という考え方は興味を惹かれますね。
一方で、関数中心でソース量が減るのは、慣れてないためか可読性が低く感じてしまいますね。。。

 今後も、更新していきます。

 今日の説明/ソースに指摘がある方は、コメントまでお願い致します。

 使用したテキストは以下の通り。