Java8深入剖析學習記錄

什麼是lambda表達式?
用於指定匿名函數或者閉包的運算符

爲什麼用lambda表達式?
在這裏插入圖片描述

public static void main(String[] args) {
        JFrame jframe = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

// 這裏不用指定類型,因爲有類型推斷機制,但是在根據上下文推斷不出來的時候,就需要自己定義了
        jButton.addActionListener(event -> {
            System.out.println("Button Pressed!");
            System.out.println("hello world");
            System.out.println("executed");
        });

        jframe.add(jButton);
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

在這裏插入圖片描述
此處表示參數類型,爲Integer或者Integer的父類,Consumer是Java8一個新的接口。
在這裏插入圖片描述Consumer代表一個操作,接受一個參數,不返回任何結果。有一個副作用,就是可能會修改這個接受的參數。接收參數i,也可以聲明類型Integer i
在這裏插入圖片描述

在這裏插入圖片描述Consumer是被@FunctionalInterface標識的接口
函數式接口:一個接口有且只有一個抽象方法。
函數接口的實例可以由lambda函數,方法引用,或者是構造方法引用來創建。
在這裏插入圖片描述

在這裏插入圖片描述上圖是線程類接口,1.8之後也成爲了函數接口,所以可以使用lambda表達式

在這裏插入圖片描述在這裏插入圖片描述加了註解,只有一個抽象方法的時候,如果重寫Objece中的方法,那麼不會造成影響,原因是,因爲這個類,他自己本身也是有Object的默認方法的。會將這個方法繼承過來。

// 左邊是參數,右邊是方法體,沒有參數,()不能省略,下圖說明,是對象而不是函數,用myInterface 引用來接收。這個特殊的對象類型,就是函數式接口
MyInterface myInterface = () -> {
            System.out.println("hello");
        };
// (p1,p2,p3) -> {
//       System.out.println("hello");
//    }

在這裏插入圖片描述之前的迭代都是屬於外部迭代,外部迭代器去迭代。比如for循環。
與之對應的內部迭代,在集合內部進行迭代。

第二種方式:
方法引用來創建函數式接口的實例:

// :: 是對Consumer接口的一個實現
 list.forEach(System.out::println);

下圖,第一種是串行流,第二種是並行流,多線程的方式效率更高一些。
在這裏插入圖片描述源 調用map方法,給定一個輸入,返回一個輸出,輸入爲函數式接口。
map映射,給定一個值,映射成另外一個值。也是返回stream。
在這裏插入圖片描述

// 兩種方式
list.stream().map(item -> item.toUpperCase()).forEach(item -> System.out.println(item));
// 方法引用,根據類和方法名進行推斷
list.stream().map(String::toUpperCase).forEach(item -> System.out.println(item));

T輸入類型 (調用方法的對象)R輸出類型(方法的返回值) result
在這裏插入圖片描述Function 接受一個參數,返回一個結果。
接口裏可以定義默認方法也可以定義靜態方法。

編寫規範
在這裏插入圖片描述

在這裏插入圖片描述排序
一種是表達式 語法
一種是語句 語法
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章