1. 程式人生 > >龜雲狄眥-Scala學習札記【二】Scala中lambda表示式的使用

龜雲狄眥-Scala學習札記【二】Scala中lambda表示式的使用

基本概念

   Lambda 表示式 Lambda 表示式”是一個匿名函式,可以包含表示式和語句,並且可用於建立委託或表示式目錄樹型別。所有 Lambda 表示式都使用 Lambda 運算子 =>;,該運算子讀為“goes to”。該 Lambda 運算子的左邊是輸入引數(如果有),右邊包含表示式或語句塊。   
   Lambda 表示式 x => x * x 讀作“x goes to x times x”。可以將此表示式分配給委託型別,如下所示:
    delegate int del(int i); 
    del myDelegate = x => x * x;
    int
j = myDelegate⑸; //j = 25

基本環境

   如果還沒有安裝Java8,那麼你應該先安裝才能使用lambda和stream。Lambda表示式是Java8中一個重要的新特性。
   lambda表示式允許你通過表示式來代替功能介面。 lambda表示式就和方法一樣,它提供了一個正常的引數列表和一個使用這些引數的主體(body,可以是一個表示式或一個程式碼塊)。

基礎語法

輸入引數

       在Lambda表示式中,輸入引數是Lambda運算子的左邊部分。它包含引數的數量可以為0、1或者多個。
1. 當輸入引數數量為0時,Lambda表示式左邊的一對小括號不能省略;
2. 當輸入引數數量為1時,Lambda表示式左邊的一對小括弧才可以省略;
3. 當輸入引數的數量大於或者等於2時,Lambda表示式左邊的一對小括弧中的多個引數質檢使用逗號(,)分割。

// 1. 不需要引數,返回值為 10  
() -> 10  

// 2. 接收一個引數(數字型別),返回其平方值  
x -> x * x  

// 3. 接受2個引數(數字),並返回他們的和  
(x, y) -> x + y  

// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  

// 5. 接受一個string物件,並在控制檯列印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)
   正如所見,lambda表示式可以將我們的程式碼縮減到一行。另一個例子是在**圖形使用者介面程式**中,**匿名類**可以使用lambda表示式來代替。 同樣,在實現Runnable介面時也可以這樣使用:
// 使用匿名內部類  
btn.setOnAction(new EventHandler<ActionEvent>() {  
          @Override  
          public void handle(ActionEvent event) {  
              System.out.println("Hello World!");   
          }  
    });  

// 或者使用 lambda expression  
btn.setOnAction(event -> System.out.println("Hello World!"));

表示式或語句塊

   多個Lambda表示式可以構成Lambda語句塊。語句塊可以放到運算子的右邊,作為Lambda的主體。
   根據主題不同,Lambda表示式可以分為表示式Lambda和語句Lambda。語句塊中可以包含多條語句,並且可以包含迴圈、方法呼叫和if語句等。
  • lambda表示式:(parameters) -> expression
  • lambda語句塊:(parameters) ->{statements; }

    如果Lambda表示式的右邊部分是一個語句塊,那麼該語句塊必須被”{“和”}”包圍。

(m,n)=>{int result=m+n; System.out.println(result);} 

Lambdas在Streams中的使用

   Stream是對集合的包裝,通常和lambda一起使用。
   使用lambdas可以支援許多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 
   Stream使用**懶運算**,他們並不會真正地讀取所有資料,遇到像getFirst() 這樣的方法就會結束**鏈式語法**。