Scala中沒有把break與continue做爲關鍵字,scala去掉了這些命令由於它們與函數式字面量齧合得很差。Continue在while循環中的意思很清楚,可是在函數式字面量中表示什麼呢?雖然scala既支持指令式風格也支持函數式風格,但在這點上它略微傾向於函數式編程,以換取語法上的簡潔性。
用if替換每一個continue和用布爾變量替換每一個break是最簡單的方式。布爾變量用來講明while循環是否應該繼續。咱們來寫一個java示例:java
package aa; public class Test8{ public static void main(String[] args){ Integer[] arr = new Integer[]{1,2,3,4,5,6,7,8,9}; int i = 0; boolean b = false; while(i < arr.length){ if(arr[i]%2 == 0){ System.out.println("continue: " + arr[i]); i++; continue; } System.out.println("continue以後: " + arr[i]); if(arr[i]%3 == 0){ b = true; System.out.println("break!!-----" + arr[i]); break; } i++; } System.out.println("arr[i]=" + arr[i] + "b=" + b); } }
這個例子從整數數組中過濾掉全部能被2整除的數,在剩下的整數中找到一個能被3整除的數字。
若是直譯成scala代碼,if以後的continue這塊能夠改寫成用if包裹while餘下的所有內容。要去掉break,只須增長一個布爾變量提示是否繼續下去便可。如例:編程
package scalaTest object Test7 { def main(args:Array[String]){ val arr = Array(1,2,4,5,6,7,8,9) println("這個數就是: " + fun1(arr)) } def fun1(arr:Array[Int]) = { var i = 0 var b = false var c = 0 while(i < arr.length && !b){ if(arr(i) % 2 != 0){ if(arr(i) % 3 == 0){ b = true c = arr(i) } } i += 1 } c } }
結果:數組
咱們提倡函數式風格,因此上面的代碼並不完美,裏面還使用了var。咱們來改進一下,把循環用遞歸函數代替,var用val代替。如例:函數式編程
package scalaTest object Test7 { def main(args:Array[String]):Unit = { val arr = Array(1,2,4,5,6,7,8,9) println(fun1(arr,0)) } def fun1(arr:Array[Int],i:Int):Int = { //遞歸函數要定義返回值類型 if(i >= arr.length || i < 0) -999 else if(arr(i) % 2 == 0) fun1(arr,i+1) else if(arr(i) % 3 == 0) arr(i) else fun1(arr,i+1) } }
注意:遞歸函數必定要定義返回值類型
函數