天天看點

Java8新特性之Lambda表達式

一、Lambda表達式概述

Lambda表達式是Java8推出的新特性,是函數式程式設計的一種實作。通過配合函數式接口,可以使代碼更加的簡潔、明了,同時可以有效地減少代碼量。Lambda通常用在需要使用匿名内部類的地方。Lambda表達式的主要目的就是突出對象的操作和行為,而簡化其它不必要的步驟。它的一般形式如下:

List<String> list = Arrays.asList("A", "B", "C");
list.forEach(e -> System.out.println(e));
           

二、使用Lambda表達式

Java8中有一個

forEach

方法用來周遊集合中的元素,在未使用Lambda表達式時我們需要這樣使用:

list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});
           

可以看出

forEach

方法需要傳入一個對象作為參數,這個對象需要實作

Consumer

接口,在沒有使用Lambda表達式時,我們需要将整個的匿名類寫出來,代碼不夠簡潔。

1.Lambda表達式的第一種形式

list.forEach((String t) -> {
    System.out.println(t);
});
           

可以看出,這種方式展現了Lambda的一般化形式,

(String t)

表示匿名内部類中的方法的參數(在Java8新特性之接口中我們提到過函數式接口中隻有一個抽象方法)以及參數類型,

->

可以看作是Lambda特有的表達式,用來将參數和代碼邏輯連接配接起來。

{}

中則是代碼邏輯。

2.Lambda表達式的簡化模式

在1中我們探讨了Lambda表達式的通用模式,但是使用起來還有有點複雜,那麼接下來我們繼續簡化Lambda。

在Java8中添加了類型推斷的特性,通過這一特性,我們就無需寫出參數的類型,這一工作将交給編譯器來完成。

list.forEach((t) -> {
    System.out.println(t);
});
           

在隻有一個參數的情況下,()也可以去掉

list.forEach( t -> {
    System.out.println(t);
});
           

在代碼邏輯較為簡單時,我們也可以這樣寫

list.forEach(t -> System.out.println(t));
           

3.擁有傳回值的Lambda表達式

list.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
});
           

Java的List集合中有一個

sort

方法,它的參數是

Comparator

對象,裡面的

compare

方法需要傳回一個int類型的值。在擁有傳回值的情況下,Lambda表達式如何處理呢?

list.sort((e,t) ->{
    return e.compareTo(t)
});
           

通常情形下,我們可以這樣寫。但是當代碼邏輯較為簡單時,比如上述情形,我們可以進一步簡化

//注意這種形式,不能加return關鍵字,return隻能在代碼塊{}中加
list.sort((e,t) ->e.compareTo(t));
           

Java編譯器會進行自動類型推斷,這種情形下,不需要也不能加return

注意:擁有兩個以上參數的時候需要寫成

(e,t,...)

這種形式

三、Lambda表達式的實際應用案例

1.建立線程對象

傳統方式

new Thread(new Runnable(){
    @Override
    public void run() {
        System.out.println("hello");
    }
}).start();
           

Lambda表達式

new Thread(() -> System.out.println("hello")).start();
           

2.數組排序

String[] str = {"A","BB","C"};
Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();
    }
});
           
Arrays.sort(str,  (o1,o2) -> o1.length() - o2.length());