Statistical Programming

JavaとScalaの違いその4 ... 多機能なfor

Scalaではforが多機能です。

 

object For extends App {

//0~4を表示.5は表示されない

    for(i<-0 until 5){

 println(i)

}

 

    println("change")

 

//1~5を表示。今度は5が表示される

    for(i<-1 to 5){

      println(i)

    }

 

    println("change")

 

    //5~1を表示。順番が逆。

    for(i<-5 to 1 by -1){

      println(i)

    }

 

    println("change")

 

    //iを使わないで単純に繰り返し

    for(_<-1 to 5){

      println("Hello")

    }

     

 

}

 

 

コンソールにはこのように正しく表示されました。

0

1

2

3

4

change

1

2

3

4

5

change

5

4

3

2

1

change

Hello

Hello

Hello

Hello

Hello

 

 

さらに、拡張forっぽいやつ、多重ループ、フィルターも簡単にできます。

 

object Exfor extends App {

//コレクションデータの処理

val iData=Array(1,2,3)

for(iArray<-iData){

println(iArray)

}

println("change")

//多重ループ

val iString=List("a","b","c")

for(i<-iData; j<-iString){

 println(i)

 println(j)

}

println("change")

//forの中でfilter

for(i<-iData if(i-2==0) & (i+1==3)){

 println(i)

}

//ifの部分を if(i-2==0); if(i+1==3) のようにも可能

println("change")

 

//フィルターをかける前にfor内だけで有効なval変数を定義

for(i<-iString; stst=i+"HeyMan!!" if stst.length() < 10){

 println(i+stst)

}

}

 

実行するとコンソールには以下のように出力されます。

 

1

2

3

change

1

a

1

b

1

c

2

a

2

b

2

c

3

a

3

b

3

c

change

2

change

aaHeyMan!!

bbHeyMan!!

ccHeyMan!!

 

 

最後のフィルターは無意味ですけど、まあこんな書き方ができるんですよねーってことで^^

 

さらにさらにScalaが得意な、値を返すこともforでできるんです!

値を返した場合は yield をfor文につけます。

 

object Yield extends App {

val data=List(1,2,3,4,5,6,7)

val datas=

for(i<-data if(i%2==0)) yield{

 i

 // i.toString() と書き込んでも同様の結果が得られます。

 

}

for(j<-datas){

 println(j)

}

}

 

 

結果、このように表示されますー

 

2

4

6

 

 

forに関してはこんなもんでしょーか^^

次回はswitch case文の代わりのmatch式について各予定ですー