內建控制結構之再也不使用break和continue

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)
    }
}

注意遞歸函數必定要定義返回值類型
函數

相關文章
相關標籤/搜索