天天看點

多線程詳解03: Lambda表達式 為什麼要使用Lambda表達式 Functional Interface(函數式接口) 推導Lambda表達式 Lambda表達式簡化過程多線程詳解03: Lambda表達式

多線程詳解03: Lambda表達式

文章目錄

  • 多線程詳解03: Lambda表達式
    • Lambda表達式:
    • 為什麼要使用Lambda表達式
    • Functional Interface(函數式接口)
    • 推導Lambda表達式
    • Lambda表達式簡化過程

Lambda表達式:

  1. λ是希臘字母表中第十一位字母,英文名稱Lambda.
  2. 使用Lambda表達式是為了避免匿名内部類定義過多.
  3. Lambda表達式的實質是函數式程式設計.
  4. 通用形式為:
(params參數) -> expression[表達式]
(params參數) -> statement[語句]
(params參數) -> {statements}
           

為什麼要使用Lambda表達式

  1. 避免内部類定義過多
  2. 提高代碼簡潔性,去掉了一堆沒有意義的代碼,隻留下核心邏輯.

Functional Interface(函數式接口)

  1. 了解Functional Interface(函數式接口)是學習JAVA8 lambda表達式的關鍵所在.
  2. 函數式接口的定義: 任何接口,如果隻包含唯一一個抽象方法,那麼它就是函數式接口.
  3. 對于函數式接口,我們可以通過lambda表達式來建立該接口的對象.

推導Lambda表達式

下面我們通過代碼來推導一下lambda表達式.

/**
 * @ClassName LambdaTest1
 * @Author clap of thunder
 * @Date 2021/9/22 16:36
 * @Description 推導lambda表達式
 **/
public class LambdaTest1 {
    public static void main(String[] args) {
        Interface ifi = new InterfaceImpl();
        ifi.interMethod();

        ifi = new InterfaceImpl2();
        ifi.interMethod();

        /**4.局部内部類:方法内部建類*/
        class InterfaceImpl3 implements Interface{
            @Override
            public void interMethod() {
                System.out.println("lambda3");
            }
        }
        ifi = new InterfaceImpl3();
        ifi.interMethod();

        /**5.匿名内部類:沒有類的名稱,必須借助接口或父類*/
        ifi = new Interface() {
            @Override//有父類是以也要重寫方法
            public void interMethod() {
                System.out.println("lambda4");

            }
        };
        ifi.interMethod();

        /**6.JDK8: Lambda表達式:函數式接口隻有一個方法,是以可以直接簡化*/
        ifi = () ->{
            System.out.println("lambda5");
        };
        ifi.interMethod();


    }

    /**3.靜态内部類
     * @author: clap of thunder
     * @date:  2021/9/22 17:33
     */
    static class InterfaceImpl2 implements Interface{
        @Override
        public void interMethod() {
            System.out.println("lambda2");
        }
    }

}

/** 1.定義一個函數式接口*/
interface Interface{
    /**
     * interMethod is good!
     * @author: clap of thunder
     * @date:  2021/9/22 17:23
     * @return null
     */
    void interMethod();

}

/** 2.實作類*/
class InterfaceImpl implements Interface{
    @Override
    public void interMethod() {
        System.out.println("lambda1");
    }
}
           

Lambda表達式簡化過程

上面的代碼讓我們看清了推導過程,但是關于Lambda表達式到底是怎樣提升代碼簡潔性的并沒有很清楚地說明.現在讓我們通過下面的執行個體來具體感悟一下:

/**
 * @author clap of thunder
 * @date 2021-09-22 18:15
 */
public class LambdaTest2 {
    public static void main(String[] args) {
        Money money = new Money() {
            @Override
            public void makeMoney(int a, int b, int c) {
                System.out.println("I have " + a+b+c + " yuan");
            }
        };
            money.makeMoney(1,2,3 );
            
        }
    }

    interface Money {
        void makeMoney(int a, int b, int c);

    }
           

簡化步驟1:使用Lambda表達式

public class LambdaTest2 {
    public static void main(String[] args) {
    //簡化步驟1:使用Lambda表達式
      money = (int a, int b, int c) -> {
                System.out.println("I have " + a+b+c + " yuan");
            };
            money.makeMoney(1,3,2);
            
        }
    }

    interface Money {
        void makeMoney(int a, int b, int c);

    }


           

簡化步驟2:Lambda去掉參數類型

public class LambdaTest2 {
    public static void main(String[] args) {
    //簡化步驟2:Lambda去掉參數類型
    money = (int a, int b, int c) -> {
               System.out.println("I have " + a + " yuan");
            };
            money.makeMoney(2,1,3);
            
        }
    }

    interface Money {
        void makeMoney(int a, int b, int c);

    }

   
  
    
           

簡化步驟3: Lambda去掉小括号類型:隻能用于隻有單個參數時

friends =(a)-> {System.out.println("I have "+a+" makeMoney");};
            friends.makeFriends(3);
            
 friends = a -> System.out.println("I have "+a+" makeMoney");
            friends.makeFriends(4);
           

步驟3的代碼來源于下面的示例:

/**
 * @author clap of thunder
 * @date 2021-09-22 18:40
 * @description
 */
public class LambdaTest3 {
        public static void main(String[] args) {

            //匿名内部類
            Friends friends = new Friends() {
                @Override
                public void makeFriends(int a) {
                    System.out.println("I have "+a+" makeMoney");
                }
            };
            friends.makeFriends(1);
            //簡化1:Lambda
            friends =(int a)-> {System.out.println("I have "+a+" makeMoney");};
            friends.makeFriends(2);
            //簡化2:Lambda去掉參數類型
            friends =(a)-> {System.out.println("I have "+a+" makeMoney");};
            friends.makeFriends(3);
            //簡化2:Lambda去掉小括号類型:隻能用于隻有單個參數時
            friends = a -> System.out.println("I have "+a+" makeMoney");
            friends.makeFriends(4);

            //總結:1.Lambda表達式隻能在隻有一行的情況下才能簡化為一行,如果有多行就要用代碼塊包裹
            //2.前提是接口為函數式接口
            //3.多個參數也可以去掉參數類型但是去掉就必須加上括号


        }
    }

    interface Friends {
        /**
         * just a test
         * @author: clap of thunder
         * @date:  2021/9/22 18:19
         * @param a  for test.
         * @return null
         */
        void makeFriends(int a);

    }

           

總結:

  1. Lambda表達式隻能在隻有一行的情況下才能簡化為一行,如果有多行就要用代碼塊包裹
  2. 前提是接口為函數式接口
  3. 多個參數也可以去掉參數類型但是去掉就必須加上括号