1. 程式人生 > 實用技巧 >java多執行緒:Lamda表示式/靜態代理

java多執行緒:Lamda表示式/靜態代理

目錄

Lamda表示式

  • 避免匿名內部類定義過多

  • 其實質屬於函數語言程式設計的概念

  • 可以讓程式碼看起來很簡潔

  • 去掉了一堆沒有意義的程式碼,只留下核心的邏輯

  • 函式式介面Functional Interface:任何介面,如果只包含唯一一個抽象方法,那麼它就是一個函式式介面(兩個必要條件:必須是介面;只有一個方法(除 Object 類包含的方法))

    //推導lambda表示式
    public class TestLambdal {
        //3.靜態內部類
        static class Like2 implements ILike{
            @Override
            public void lambda() {
                System.out.println("bbbbb");
            }
        }
        public static void main(String[] args) {
            ILike like = new Like();
            like.lambda();
            like=new Like2();
            like.lambda();
    
            //4.區域性內部類
            class Like3 implements ILike{
                @Override
                public void lambda() {
                    System.out.println("ccccccc");
                }
            }
            like=new Like3();
            like.lambda();
    
            //5.匿名內部類:沒有類的名稱,必須藉助介面或父類
            like=new ILike() {
                @Override
                public void lambda() {
                    System.out.println("ddddddd");
                }
            };
            like.lambda();
    
            //6.用lambda簡化
            like=()->{
                System.out.println("eeeeeee");
            };
            like.lambda();
            //繼續簡化
            like=()-> System.out.println("fffff");
    
            like.lambda();
        }
    }
    //1.定義一個函式式介面
    interface ILike{
        void lambda();
    }
    //2.實現類
    class Like implements ILike{
        @Override
        public void lambda() {
            System.out.println("aaaaa");
        }
    }
    
  • 總結:

    • lambda表示式只能有一行程式碼的情況下才能簡化成為一行,如果有多行,要用程式碼塊包裹
    • 方法有引數時,可以去掉引數型別

靜態代理

  • 真實物件和代理物件都要實現同一個介面

  • 代理物件要代理真實角色

  • 好處:

    • 代理物件可以做很多真實物件做不了的事情
    • 真實物件專注做自己的事情
  • 靜態代理其實是多執行緒的底部實現原理

    public class StaticProxy {
        public static void main(String[] args) {
            new Thread(()-> System.out.println("I love you")).start();
            //上面的Thread類 代理了一個真實的Runnable介面
            new WeddingCompany(new You()).HappyMarry();
        }
    }
    
    interface Marry{
        void HappyMarry();
    }
    //真實角色,你去結婚
    class You implements Marry{
        @Override
        public void HappyMarry() {
            System.out.println("結婚~");
        }
    }
    //代理角色,婚慶公司
    class WeddingCompany implements Marry{
        private Marry target;
    
        public WeddingCompany(Marry target) {
            this.target = target;
        }
    
        @Override
        public void HappyMarry() {
            before();
            this.target.HappyMarry();//真實物件
            after();
    
        }
    
        private void after() {
            System.out.println("交錢");
        }
    
        private void before() {
            System.out.println("佈置現場");
        }
    }