天天看點

jdk1.8新特性——Lambda表達式與函數式接口

書到用時方恨少,由于前幾日在對接公司的一個項目中,發現該項目用到了很多jdk8的新特性,代碼非常的簡潔,但是卻由于對jdk8的新特性了解甚少,以緻很多代碼邏輯都看不懂,是以花了些時間學習了jdk8比較重要的幾個新特性,并在此進行總結!

Lambda表達式

在java集合中,通過forEach方法周遊集合就用到了jdk1.8的新特性:Lambda表達式與函數式接口

先看forEach方法的源碼:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}
           

由方法源碼可知,forEach方法是Iterable接口(java.lang)中的一個預設方法,該方法接收一個函數式接口Consumer作為參數,Consumer接口是四大函數式接口之一,屬于消費型接口,何為消費型,該接口的唯一抽象方法是

void accept(T t);

方法接收一個參數,但是沒有傳回值,也就是簡單的了解成把這個參數給消費了,該方法多用于接收一個參數之後,使用輸出語句輸出該參數的值;該方法的處理邏輯就是将集合中的每一個元素都使用了Consumer接口的accept方法處理邏輯。

//1.匿名内部類的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Consumer<Integer> consumer=new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println(integer);
    }
};
list.forEach(consumer);
           
2.匿名内部類的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println(integer);
    }
});
           
3.jdk1.8 Lambda表達式的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach((Integer v)-> {System.out.println(v);});
           

對于Lambda表達式,還可以進一步簡化書寫,如果方法體隻有一行語句,那麼可以省略語句之後的分号以及省略方法體的大括号,如果這行語句是以return傳回的,還可以直接省略return。需要注意的是:一般要省略就一起省略,也就是分号、大括号、return三者一起省略;對于參數,可以省略參數的類型,另外,如果是隻有一個參數,還可以省略參數的括号。

對于上面的Lambda表達式,簡化寫法如下:

四大函數式接口

函數式接口指的是接口中隻包含一個抽象方法,預設方法和靜态方法數量不限的接口;jdk1.8以後,還新增了@FunctionalInterface注解來标注函數式接口;所有函數式接口都位于java.util.function包下。

  1. Function:功能型函數式接口,

    R apply(T t);

    該方法接收一個參數,并傳回一個值;示例:
  1. Consumer:消費型函數式接口,

    void accept(T t);

    該方法接收一個參數,不做任何傳回
  1. Predicate:斷言型函數式接口,

    boolean test(T t);

    該抽象方法接收一個參數,并傳回一個布爾值
  1. Supplier:供給型函數式接口,

    T get();

    該方法不接收任何參數,但是會傳回一個值

關于jdk1.8的其它新特性:

  1. jdk1.8新特性——Optional類:https://blog.csdn.net/can_chen/article/details/106886579
  2. jdk1.8新特性——Stream流式程式設計:https://blog.csdn.net/can_chen/article/details/106886484
  3. jdk1.8新特性——方法引用:https://blog.csdn.net/can_chen/article/details/106886536