1. 程式人生 > >快速瞭解Lambda表示式-Java

快速瞭解Lambda表示式-Java

目錄

  • lambda表示式
    • 前言
    • 簡介
      • 簡單入門
    • 用法
    • 好處
    • 總結

lambda表示式

前言

最近因為疫情,也不能正常返校什麼的,希望大家都能好好的,希望武漢加油,中國加油,在家也看了很多視訊,學了一點新的東西,雖然懶惰,但是也要努力啊。今天記錄分享Lambda表示式的知識。

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形參列表的引數型別可以省略,如果只有一個引數的時候,也可以省略括號

表示式的右邊:Lambda體,一對{}包裹著,只有一條執行語句的時候,也可以省略大括號,若有返回值,省略的時候也可以省略return

最後,以前用匿名內部類的地方都可以使用Lambda表示式類代替.

這一篇文字沒寫多少,因為我覺得學的太慢了,不能浪費太多時間在做部落格上,所以以記錄分享為主,菜鳥一枚,加油,共勉!