快速瞭解Lambda表達式-Java

lambda表達式

前言

最近由於疫情,也不能正常返校什麼的,但願你們都能好好的,但願武漢加油,中國加油,在家也看了不少視頻,學了一點新的東西,雖然懶惰,可是也要努力啊。今天記錄分享Lambda表達式的知識。ide

Lambda表達式是JDK8新增的特性 下面的圖就是JDK8的新特性,JDK5和JDK8相對來講都是比較重要有的Java版本。函數

因此學習使用其中的新特性也是比較重要的。學習

簡介

Lambda表達式指的是應用在單一抽象方法接口環境下的一種簡化定義形式,能夠用來解決匿名內部類的定義複雜問題。
今天這篇講的是lambda表達式,它是一種新的語法規則。它是一種匿名函數,簡單地說,它是沒有聲明的方法,也即沒有訪問修飾符、返回值聲明和名字。它能夠寫出更簡潔、更靈活的代碼。做爲一種更緊湊簡潔的代碼風格,使 Java 語言的表達能力獲得了提高。

簡單入門

interface Message {
    public void print();
}

public class TestDemo {
    public static void main(String[] args){
        //lambda表達式,這裏是覆寫接口中的print方法
        fun() -> System.out.println("hello world");
       //原來的寫法
       // fun(new Message(){
       //   @Override
       // public void print)() {
       //   System.out.println("hello world");
       //}
       //});
    }
public static void print(Message msg){
    msg.print();
 }
}

用法

  • Lambda的基本語法以下

(參數) -> 方法體/lambda體
解析:
    左邊是成員列表/形參列表(有時就是接口中的抽象方法的方法引用)
    右邊的方法體是要重寫的抽象方法的方法體
    -> 是操做符,也叫作lambda箭頭操做符
  • 簡單示例

// 1. 不須要參數,返回值爲   
() -> 1  
  
// 2. 接收一個參數(數字類型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2個參數(數字),並返回他們的差值  
(x, y) -> x – y  
  
// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  
  
// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)
  • 具體使用方法/寫法-一共能夠分爲六種狀況去寫。

/**
 * @Author: yhy
 * @Time: 22:37
 * 用來測試使用lambda語句
 */
public class LambdaDemo {
//    -> lambda操做符

    //    狀況一:無參且無返回值
    @Test
    public void test1() {
//        原來的寫法
        Runnable r0 = new Runnable() {
            @Override
            public void run() {
                System.out.println("abc");
            }
        };

//        lambda寫法
        Runnable r = () -> System.out.println("abc");
        r.run();
    }

    //狀況二 須要一個參數,但沒有返回值
//    原始寫法
    Consumer<String> con = new Consumer<>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }

    };

    //    lambda寫法
    Consumer<String> con2 = (String s) -> {
        System.out.println(s);
    };

    //狀況三:數據類型省略,可推斷出類,又叫作類型推斷 前面已經知道是string類型了
//    因此這裏直接省略了後面的括號的string類型說明
//    和泛型的格式很像,能夠省略後面的類型說明
    Consumer<String> con3 = (s) -> {
        System.out.println(s);
    };

    //    狀況四:一個參數的時候, 括號能夠不寫 下面的s就是一個參數
    @Test
    public void test2() {
        Consumer<String> con4 = s -> {
            System.out.println(s);
        };
        con4.accept("abcdefg");
    }

    // 狀況五:須要兩個或者以上的參數,且方法中多條執行語句,而且有返回值
    @Test
    public void test3() {
//        原來的寫法
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(02);
            }
        };
        System.out.println(com.compare(13,15));
//        lambda表達式
        System.out.println("------------------");
        Comparator<Integer> com2 =(o1,o2) -> {
            return o1.compareTo(02);
        };
        System.out.println(com2.compare(14,12));
    }
//    狀況六:當lambda只有一條語句時候,能夠在lambda體中省略括號和return
    @Test
    public void test4(){
//        原來的寫法
    Comparator<Integer> com1 = (o1,o2) -> {return o1;};
    }
//    lambda規則六表達式寫法
    Comparator <Integer> com2 = (o1, o2) -> o1;
}

好處

可以簡潔,快速寫代碼,看的出代碼量差異,可是有一說一,有時不會很好懂,可是看得懂仍是最基本的要求。測試

總結

表達式的左邊:Lambda形參列表的參數類型能夠省略,若是隻有一個參數的時候,也能夠省略括號code

表達式的右邊:Lambda體,一對{}包裹着,只有一條執行語句的時候,也能夠省略大括號,如有返回值,省略的時候也能夠省略return視頻

最後,之前用匿名內部類的地方均可以使用Lambda表達式類代替.對象

這一篇文字沒寫多少,由於我以爲學的太慢了,不能浪費太多時間在作博客上,因此以記錄分享爲主,菜鳥一枚,加油,共勉!接口

相關文章
相關標籤/搜索