java 8新特性學習之二:Java 8 lambda表示式初步第二回

孫小光發表於2016-06-09

塊lambda表示式
上節列子中顯示的lambda體只包含單個表示式。這種型別的lambda體被稱為表示式體,具有表示式體的lambda表示式有時候被稱為表示式lambda。儘管表示式lambda十分有用,但是有時候會要求使用一個以上的表示式。為了處理這類情況,Java支援另外一種型別的lambda表示式,其中操作符右側的程式碼可以由一個程式碼塊構成,其中可以包含多條語句。這種型別的lambda體被稱為塊體。具有塊體的lambda表示式有時候被稱為塊lambda。

塊lambda擴充套件了lambda表示式內部可以處理的操作型別,因為它允許lambda體包含多條語句。建立塊lambda很容易,只需要使用花括號包圍lambda體,就像建立其他語句塊一樣。

除了允許多條語句,塊lambda的使用方法與剛才討論過的表示式lambda十分類似。但是,也有一個重要區別:在塊lambda中必須顯式使用return語句來返回值。必須這麼做,因為塊lambda體代表的不是單獨一個表示式。

//下邊這個例子實現了一個int型別值的階乘:
interface NumericFunc{
   int func(int n);
}

class BlockambdaDemo{
    public static void main(String args[]){  
         NumericFunc factorial = (n)->{
             int result = 1;
             for(int i=1;i<=n;i++){
                 result = i*result;
             }
             return result;
         };
         System.out.println("The factoral of 3 is "+factorial.func(3));
         System.out.println("The factoral of 5 is "+factorial.func(5));
    }
}  

輸出如下所示:

The factorial of 3 is 6
The factorial of 5 is 120

塊lambda體在本質上與方法體類似。別外一點:當lambda表示式中出現return語句時,只是從lambda體返回,而不會導致包圍lambda體的方法返回。

//使用lambda顛倒一個字串。
interface StringFunc{
    String func(String n);
}

class BlocklambdaDemo2{
    public static void main(String args[]){
        StringFunc reverse = (str)->{
            String result = "";
            int i;
            for(i = str.length()-1;i>=0;i--){
                 result += str.charAt(i);
            }
            return result;
        };
        System.out.println("lambda reversed is "+reverse.func("lambda"));
        System.out.println("Expression reversed is "+reverse.func("Expression"));
    }
}

輸出如下所示:

lambda reversed is adbmal
Expression reversed is noisserpxE

在這個例子中,函式式介面StringFunc宣告瞭func()方法。該方法接受一個String型別的引數,並返回一個String型別的結果。因此,在reverse lambda表示式中,推斷出str的型別為String。注意,對str呼叫了charAt()方法。之所以能夠這麼呼叫,是因為推斷出了str的型別是String。

相關文章