JDK8新特性二:jdk8之Lambda表達式

JDK8新特性二:jdk8之Lambda表達式

函數式編程和Lambda表達式

  1. 函數式編程:可以理解爲將一個函數作爲參數值進行傳遞。
  2. 面向對象是對數據的抽象,即:各種各樣的pojo類。函數式編程則是對行爲的抽象,將行爲作爲一個參數進行傳遞。

jdk8之前和jdk8之後線程創建的對比

  1. jdk8之前創建線程
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("你好~");
    }
}).start();
  1. jdk8之後創建方法體,使用Lambda
//一個(),一個箭頭->指向方法體,整個叫做一個函數。
new Thread(()-> System.out.println("你好啊~")).start();
//也可以這樣
new Thread(()->{
            
            System.out.println("你好啊~")
        } ).start();
//花括號li可以加很多邏輯
  1. jdk8之前的list排序比較
List<String> list=Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});
for(String string:list){
    System.out.println(string);
}
  1. jdk8之後的list排序比較
List<String> list2=Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list2,(a,b)->b.compareTo(a));
for(String string:list2){
    System.out.println(string);
}

Lambda的使用場景

  1. 使用場景:

一個接口中只包含一個方法,則可以使用Lambda表達式,這樣的接口稱爲"函數接口"

(parames)->expression

第一個部分爲:括號內用逗號分割的形式參數,參數是函數式接口裏面的方法的參數。第二部分爲一個箭頭符號:->;第三部分爲方法體,可以是表達式和代碼塊。 例如:new Thread(new Runable()),裏面傳遞了一個Runable()對象,但是Runable()對象裏面只有一個方法run(),這時就可以不用寫這個Runable(),直接用()代替run()方法。

參數列表:
括號中參數列表的數據類型可以省略不寫。

​ 括號中的參數只有一個,那麼參數類型和()都可以省略不寫。

方法體:

​ 如果{}中的代碼只有一行,無論是否有返回值,可以省略{}、return、和分號,要一起省略。否則要都要加上去。也就是說花括號、和分號、和return(如果需要return語句)要有都有,要沒有都沒有。

Lambda表達式的好處:

​ Lambda表達式的實現方式在本質上是以匿名內部類的方式實現的。重構臃腫代碼,提高開發效率。

Lambda表達式自定義Lambda接口編程

  1. 定義 一個函數式接口,需要標註此接口@FunctionalInterface,否則萬一團隊成員在接口上加了其他方法則容易出現故障。
  2. 編寫一個方法,輸入需要操作的數據和接口。
  3. 在調用方法時傳入數據和lambda表達式,用來操作數據。

注意: 函數式編程和lambda表達式是一起的,沒有函數式編程也就沒有lambda表達式。

第一步:

@FunctionalInterface
public interface OperFunction<R,T> {
    R operation(T t1,T t2);
}

第二步:

public static void  main(String[] args) throws IOException {        
    System.out.println(operator(20,5,(Integer x,Integer y)->{
        return x*y;
    }));
    System.out.println(operator(20,5,(x,y)->x+y));
    System.out.println(operator(20,5,(x,y)->x-y));
    System.out.println(operator(20,5,(x,y)->x/y));

}
//這個方法就是函數式編程,將OperFunction<Integer,Integer>當成參數傳進去。
public static Integer operator(Integer x, Integer y, OperFunction<Integer,Integer> of){
    return of.operation(x,y);
}
發佈了216 篇原創文章 · 獲贊 202 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章