亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java8中使用Lambda表達式

發布時間:2021-04-17 15:35:03 來源:億速云 閱讀:167 作者:Leah 欄目:開發技術

怎么在Java8中使用Lambda表達式?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1. lambda表達式介紹

lambda表達式是Java8提供的新特性之一,也可以稱之為閉包;它支持Java能夠進行簡單的函數式編程,也就是說可以把一個匿名函數作為一個方法的參數進行傳遞;其格式分為三部分,第一部分為入參列表,第二部由->固定組成,第三部分為方法體;

public class LambdaTest {

    public static void main(String[] args) {
        // 使用lambda表達式創建線程
        Thread thread = new Thread(() -> {
            System.out.println("thread running");
        });
        thread.start();
    }
}

// 運行結果
thread running

2. lambda表達式的重要特征

可選的參數類型聲明:不需要聲明參數的類型,編譯器可以統一識別參數值;

public class LambdaTest {

    private Integer a;

    public LambdaTest(Integer a) {
        this.a = a;
    }

    public void print(LambdaInterface lambdaInterface) {
        lambdaInterface.print(this.a);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123);
        // 聲明參數類型
        System.out.println("聲明參數類型");
        lambdaTest.print((Integer a) -> {
            System.out.println("a: " + a);
        });
        // 不聲明參數類型
        System.out.println("不聲明參數類型");
        lambdaTest.print((a) -> {
            System.out.println("a: " + a);
        });
    }
}

interface LambdaInterface {
    void print(Integer a);
}

// 運行結果
聲明參數類型
a: 123
不聲明參數類型
a: 123

可選的參數圓括號:一個參數時不需要定義圓括號,但沒有參數或者多個參數時則必須要定義;

public class LambdaTest {

    private Integer a;

    public LambdaTest(Integer a) {
        this.a = a;
    }

    public void print(LambdaInterface lambdaInterface) {
        lambdaInterface.print(this.a);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123);
        // 定義參數圓括號
        System.out.println("定義參數圓括號");
        lambdaTest.print((a) -> {
            System.out.println("a: " + a);
        });
        // 一個參數可不定義參數圓括號
        System.out.println("一個參數可不定義參數圓括號");
        lambdaTest.print(a -> {
            System.out.println("a: " + a);
        });
    }
}

interface LambdaInterface {
    void print(Integer a);
}

// 運行結果
定義參數圓括號
a: 123
一個參數可不定義參數圓括號
a: 123

可選的大括號:如果方法體僅有一個語句,可不需要使用大括號;

public class LambdaTest {

    private Integer a;

    public LambdaTest(Integer a) {
        this.a = a;
    }

    public void print(LambdaInterface lambdaInterface) {
        lambdaInterface.print(this.a);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123);
        // 使用方法體大括號
        System.out.println("使用方法體大括號");
        lambdaTest.print(a -> {
            System.out.println("a: " + a);
        });
        // 一個語句可不使用方法體大括號
        System.out.println("一個語句可不使用方法體大括號");
        lambdaTest.print(a -> System.out.println("a: " + a));
    }
}

interface LambdaInterface {
    void print(Integer a);
}

// 運行結果
使用方法體大括號
a: 123
一個語句可不使用方法體大括號
a: 123

可選的返回關鍵字:如果方法體僅有一個表達式返回值語句,可不需要聲明返回關鍵字,但存在大括號時則必須聲明;

public class LambdaTest {

    private Integer a;
    private Integer b;

    public LambdaTest(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }

    public Integer sum(LambdaInterface lambdaInterface) {
        return lambdaInterface.calculate(this.a, this.b);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123, 456);
        // 聲明返回關鍵字
        System.out.println("聲明返回關鍵字");
        Integer s1 = lambdaTest.sum((Integer a, Integer b) -> {
            return a + b;
        });
        System.out.println(s1);
        // 一個表達式返回值語句可不聲明返回關鍵字
        System.out.println("一個表達式返回值語句可不聲明返回關鍵字");
        Integer s2 = lambdaTest.sum((a, b) -> a + b);
        System.out.println(s2);
    }
}

interface LambdaInterface {
    Integer calculate(Integer a, Integer b);
}

// 運行結果
聲明返回關鍵字
579
一個表達式返回值語句可不聲明返回關鍵字
579

3. lambda表達式對域外變量的限制

lambda表達式對域外的局部變量具有隱性final語義的限制,但對成員變量沒有該限制;

public class LambdaTest {

    private Integer a;
    private Integer b;

    public LambdaTest(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }

    public Integer sum(LambdaInterface lambdaInterface) {
        return lambdaInterface.calculate(this.a, this.b);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123, 456);
        int c = 111;
        Integer s1 = lambdaTest.sum((a, b) -> {
            // 修改域外局部變量將出現編譯錯誤
            c = 222;
            return a + b;
        });
        System.out.println(s1);

        int d = 333;
        Integer s2 = lambdaTest.sum((a, b) -> {
            // 域外修改lambda表達式內部使用過的域外局部變量也將導致編譯錯誤
            return a + b + d;
        });
        d = 444;
        System.out.println(s2);
    }
}

interface LambdaInterface {
    Integer calculate(Integer a, Integer b);
}
public class LambdaTest {

    private Integer a;
    private Integer b;
    private Integer c;

    public LambdaTest(Integer a, Integer b, Integer c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public Integer sum(LambdaInterface lambdaInterface) {
        return lambdaInterface.calculate(this.a, this.b);
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest(123, 456, 789);
        Integer s1 = lambdaTest.sum((a, b) -> {
            // 沒有出現編譯錯誤
            lambdaTest.c = 999;
            return a + b + lambdaTest.c;
        });
        System.out.println(s1);
    }
}

interface LambdaInterface {
    Integer calculate(Integer a, Integer b);
}

// 運行結果
1578

4. lambda表達式的優缺點

優點:

1.使代碼更加簡潔;

2.減少匿名內部類的創建,節省資源;

缺點:

1.可維護性差,必須熟悉抽象方法的參數列表;

2.可讀性差,必須對lambda表達式有一定深入;

5. lambda表達式的使用場景

在聲明方法時,方法的形參列表包含一個或者多個函數式接口就可以使用lambda表達式;如:

使用實現Runnable接口創建線程

使用實現Callable接口創建FutureTask

使用四大函數式接口消費者接口Consumer提供者接口Supplier斷言型接口Predicate函數型接口Function


6. lambda表達式的實現原理

lambda表達式是通過特定的語法,讓編譯器對java文件進行編譯時,針對每一個lambda表達式會編譯成一個對應的靜態方法,由此也可證明lambda表達式并不是一種語法糖;

// 對上面的LambdaTest.java編譯后的LambdaTest.class文件使用javap -p進行查看將會得到如下結果
javap -p LambdaTest.class
Compiled from "LambdaTest.java"
public class cn.jackiegu.java8.study.lambda.LambdaTest {
  private java.lang.Integer a;
  private java.lang.Integer b;
  private java.lang.Integer c;
  public cn.jackiegu.java8.study.lambda.LambdaTest(java.lang.Integer, java.lang.Integer, java.lang.Integer);
  public java.lang.Integer sum(cn.jackiegu.java8.study.lambda.LambdaInterface);
  public static void main(java.lang.String[]);
  private static java.lang.Integer lambda$main$0(cn.jackiegu.java8.study.lambda.LambdaTest, java.lang.Integer, java.lang.Integer);
}

看完上述內容,你們掌握怎么在Java8中使用Lambda表達式的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭州市| 昭通市| 且末县| 常山县| 偏关县| 灵石县| 永仁县| 海口市| 邯郸县| 土默特左旗| 高雄市| 德惠市| 个旧市| 乌兰浩特市| 高州市| 呈贡县| 察哈| 阿拉善盟| 保靖县| 信阳市| 紫云| 白银市| 辰溪县| 上栗县| 泰和县| 遂昌县| 赤城县| 故城县| 正定县| 呼玛县| 高雄市| 乃东县| 政和县| 峨眉山市| 龙南县| 抚宁县| 中阳县| 中江县| 萨嘎县| 石家庄市| 义马市|