Java中lambda(λ)表達式的語法


舉一個排序的例子,我們傳入代碼來檢查一個字符串是否比另一個字符串短。這里要計算:

first.length() - second.length()

first和second是什么?他們都是字符串。Java是一個強類型語言,所以我們還要指定他們的類型:

(String first, String second)
    -> first.length() - second.length()

lambda表達式就是一個代碼塊,以及必須傳入代碼的變量規范。

你已經見過Java中的一種lambda表達式形式:參數,箭頭(->)以及一個表達式。如果代碼要完成的計算無法放在一個表達式中,就可以像寫方法一樣,把這些代碼放在{}中,並且包含顯式的return語句。例如:

(String first, String second) ->
    {
        if(first.length()<second.length()) return -1;
        else if(first.length()>second.length()) return 1;
        else return 0;
    }

即使lambda表達式沒有參數,仍然要提供空括號,就像無參數方法一樣:

() -> {for(int i=100; i>=0; i--) System.out.println(i);}

如果可以推導出一個lambda表達式的參數類型,則可以忽略其類型。例如:

Comparator<String> comp
    =(first,second) //same as (String first,String second)
        ->first.length() - second.length();

在這里,編譯器可以推導出first和second必然是字符串,因為這個lambda表達式將賦給一個字符串比較器。

如果方法只有一個參數,而且這個參數的類型可以推導出,那么甚至可以省略小括號:

ActionListener listener = event ->
    System.out.println("The time is" + new Date());

無需指定lambda表達式的返回類型。lambda表達式的返回類型總是會由上下文推導得出。例如,下面的表達式

(String first, String second) -> first.length() - second.length()

可以在需要int類型結果的上下文中使用。

下面的Java代碼顯示了如何在一個比較器和一個動作監聽器中使用lambda表達式

package lambda;

import java.util.Arrays;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class LambdaTest {

    public static void main(String[] args) {
        String[] planets = new String[] { "zhangsan", "lisi", "wangwu", 
                "zhaoliu", "xiaoming", "xiaohong", "xiaofang","quzi" };
        System.out.println(Arrays.toString(planets));
        System.out.println("按字典順序排序:");
        Arrays.sort(planets);
        System.out.println(Arrays.toString(planets));
        System.out.println("按長度排序:");
        Arrays.sort(planets, (first, second) -> first.length() - second.length());
        System.out.println(Arrays.toString(planets));

        Timer t = new Timer(1000, event -> System.out.println("The time is" + new Date()));
        t.start();

        // 保持程序的運行,直到用戶點擊“確定”
        JOptionPane.showMessageDialog(null, "Quit program?");
        System.exit(0);
    }

}

運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM