1. 程式人生 > >JDK8-lambda表示式以及介面可以定義預設方法

JDK8-lambda表示式以及介面可以定義預設方法

一、Lambda表示式

1、Lamdba

       Lambda 允許把函式作為一個方法的引數,使用Lamdba可以讓開發的程式碼更加簡潔,但是易讀性差,新人不瞭解Lamdba表示式或者程式碼功底有點差,不容易讀懂大佬們寫的程式碼了。

2、Lamdba語法格式

(parameter1,parameter2.....) -> {expression;};

引數可以是多個,也可以是1個,也可以沒有引數,expression 同樣是多個,或者是1個,或者無表示式

簡單例子:

        // TODO: 2018/11/19 申明資料型別
        NumberInterface addOperate = (int a,int b) -> a + b;//加
        // TODO: 2018/11/19 不申明資料型別
        NumberInterface subOperate = (a, b) -> a - b;//減
        // TODO: 2018/11/19 不申明返回語句
        NumberInterface mulOperate = (a,b) -> a * b; //乘
        // TODO: 2018/11/19 申明返回語句
        NumberInterface divOperate = (a,b) -> {//除
            return a / b;
        };
NumberInterface = (int a,int b) -> a + b;

這裡我申明瞭一個函式,變數名為addOperate ,函式值等於(int a,int b)-> a + b;

3、NumberInterface

JDK8以後的介面方法可以有方法體。

a、JDK7以前的版本,修改定義的介面之後,需要修改全部實現該介面的類;

b、JDK8以後的版本,我們可以定義有方法體的method,這樣可以相容老版本的程式碼;

c、所以引進的預設方法,目的是為了解決介面的修改與現有的實現不相容的問題。

package com.cn.dl;

/**
 * Created by Tiger on 2018/11/19.
 * JDK8以後的介面最大的區別就是方法可以有方法體,
 * 1、JDK7以前的版本,當需要修改介面時候,需要修改全部實現該介面的類
 * 2、JDK8以後的版本,我們可以定義有方法體的method,這樣可以相容以前版本的程式碼。
 * 3、所以引進的預設方法,目的是為了解決介面的修改與現有的實現不相容的問題。
 */
public interface NumberInterface {

    int numberOperate(int a,int b);

    // TODO: 2018/11/19 在介面中定義靜態預設方法
    static int operate(int numberA,int numberB,NumberInterface nunberInterface){
        return nunberInterface.numberOperate(numberA,numberB);
    }

    // TODO: 2018/11/19 介面中定義預設方法
    default String getMessage(String message){
        return "interface"+message;
    };

}

4、LambdaTest

package com.cn.dl;


/**
 * Created by Tiger on 2018/11/19.
 */
public class LamdbaTest {

    public static void main(String[] args) {

        int numberA = 100;
        int numberB = 20;

        // TODO: 2018/11/19 申明資料型別
        NumberInterface addOperate = (int a,int b) -> a + b;//加
        // TODO: 2018/11/19 不申明資料型別
        NumberInterface subOperate = (a, b) -> a - b;//減
        // TODO: 2018/11/19 不申明返回語句
        NumberInterface mulOperate = (a,b) -> a * b; //乘
        // TODO: 2018/11/19 申明返回語句
        NumberInterface divOperate = (a,b) -> {//除
            return a / b;
        };
        System.out.println("add>>>"+NumberInterface.operate(numberA,numberB,addOperate));
        System.out.println("sub>>>"+NumberInterface.operate(numberA,numberB,subOperate));
        System.out.println("mul>>>"+NumberInterface.operate(numberA,numberB,mulOperate));
        System.out.println("div>>>"+NumberInterface.operate(numberA,numberB,divOperate));

        //呼叫NumberInterface中預設方法
        InterfaceTest interfaceTest = new InterfaceTest();
        System.out.println(interfaceTest.getMessage(" hello"));
    }
}

5、結果

add>>>120
sub>>>80
mul>>>2000
div>>>5
interface hello

6、總結

a、lambda表示式主要為了執行方法型別的介面,避免定義匿名方法,開發更加簡潔;

b、lambda中使用外層的變數,不能在lamdba表示式中修改其值,外層變數可以不是final型別的,但是絕對不可以在lambda表示式中修改外層變數的值。(Variable used in lambda expression should be final or effectively final)

c、lambda不可以定義一個和外層變數名相同的變數,與變數型別無關。(variable ‘i’ is already defined in the scope)

7、其它測試類

a、InterfaceTest

package com.cn.dl;

/**
 * Created by Tiger on 2018/11/19.
 */
public class InterfaceTest implements NumberInterface {

    // TODO: 2018/11/19 必須重寫介面中申明的方法(沒有方法體) 
    @Override
    public int numberOperate(int a, int b) {
        return 0;
    }
}

b、ThreadLamdbaTest

package com.cn.dl;

import java.util.concurrent.TimeUnit;

/**
 * Created by Tiger on 2018/11/19.
 */
public class ThreadLamdbaTest {
    public static void main(String[] args) {

        //普通寫法
        new Thread(){
           public void run(){
               try {
                   TimeUnit.SECONDS.sleep(10);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("general thread");
           }
        }.start();
        System.out.println("general method");

        //lamdba寫法
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("lambda thread");
        }).start();
        System.out.println("lambda method");
    }
}