• Java多线程之相关拓展(静态代理和Lamda表达式演变)


    一、静态代理

    1、概念

    真实对象和代理对象都要实现同一个接口
    代理对象要代理真实角色

    2、优点

    代理对象可以做很多真实对象做不了的事情
    真实对象专注做自己的事情

    3、样例

    package com.example.multithreading.demo3;
    
    public class StaticProxy {
    
        public static void main(String[] args) {
    
            You you = new You();
    //        1、没加多线程的操作
    //        WeddingCompany weddingCompany = new WeddingCompany(you);
    //        weddingCompany.HappyMarray();
    
            // 2、使用多线程的操作
            new Thread(() ->System.out.println("开始")).start();
            new WeddingCompany(new You()).HappyMarray();
        }
    }
    
    interface Marray{
        void HappyMarray();
    }
    
    // 真实角色
    class You implements Marray{
        @Override
        public void HappyMarray(){
            System.out.println("主体操作");
        }
    }
    
    // 代理角色
    class WeddingCompany implements Marray{
    
        //代理真实目标角色
        private Marray target;
    
        public WeddingCompany(Marray target) {
            this.target = target;
        }
    
        @Override
        public void HappyMarray(){
            before();
            // 这就是真实对象
            this.target.HappyMarray();
            after();
        }
    
        private void before(){
           System.out.println("代理之前的操作");
        }
    
        private void after(){
           System.out.println("代理之后的操作");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    结果
    在这里插入图片描述

    二、Lamda表达式(演变过程展示)

    1、定义一个函数式接口并实现类(最初状态)

    一开始是定义一个接口。然后主程序调用成功。

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
            Ilike like = new Like();
            like.lambda(1);
        }
    }
    
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    // 2、实现类
    class Like implements Ilike {
        @Override
        public void lambda(int a) {
            System.out.println("lambda:" + a);
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    结果
    在这里插入图片描述

    2、静态内部类(状态演变2)

    演变成静态内部类,再调用成功

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        // 3、静态内部类
        static class Like2 implements Ilike{
            @Override
            public void lambda(int a){
                System.out.println("lambda2:" + a);
            }
        }
    
        public static void main(String[] args) {
            Ilike like = new Like2();
            like.lambda(2);
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    结果
    在这里插入图片描述

    3、局部内部类(状态演变3)

    演变成局部内部类,发现调用依然正常

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
    
            // 4、局部内部类
            class Like3 implements Ilike{
                @Override
                public void lambda(int a) {
                    System.out.println("lambda3:" + a);
                }
            }
    
            Ilike like = new Like3();
            like.lambda(3);
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    结果
    在这里插入图片描述

    4、匿名内部类(状态演变4)

    将其简化成匿名内部类后依然调用成功

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
        
        public static void main(String[] args) {
            // 5、匿名内部类,没有类的名称,必须借助接口或者父类
            Ilike like = new Ilike() {
                @Override
                public void lambda(int a) {
                    System.out.println("lambda4:" + a);
                }
            };
            like.lambda(4);
    
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    结果
    在这里插入图片描述

    5、用lambda简化(状态演变5)

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
            // 6、用lambda简化
            Ilike like = (int a) -> {
                System.out.println("lambda5:" + a);
            };
            like.lambda(5);
    
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果
    在这里插入图片描述

    6、用lambda简化一(去掉参数类型)

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
            // 7、用lambda简化二
            Ilike like = (a) -> {
                System.out.println("lambda5:" + a);
            };
            like.lambda(6);
    
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果
    在这里插入图片描述

    7、用lambda简化二(简化括号)

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
            // 8、用lambda简化三
            Ilike like = a -> {
                System.out.println("lambda5:" + a);
            };
            like.lambda(7);
    
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果
    在这里插入图片描述

    8、用lambda简化三(去掉花括号)

    package com.example.multithreading.demo4;
    
    /**
     * 推导lambda表达式
     */
    public class lamda {
    
        public static void main(String[] args) {
            // 9、用lambda简化四
            Ilike like = a -> System.out.println("lambda5:" + a);
            like.lambda(8);
        }
    }
    
    // 1、定义一个函数式接口
    interface Ilike{
        void lambda(int a);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结果
    在这里插入图片描述

    9、注意

    lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
    前提是接口为函数式接口。
    多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号。

  • 相关阅读:
    【RabbitMQ】消息队列需要解决的几个问题
    机器学习实验——kNN算法
    基于nodejs+vue 宁夏旅游景点客流量数据分析系统
    [附源码]java毕业设计大学生评奖评优系统
    如何做好水库大坝实时安全监测
    HTML期末大学生网页设计作业——奇恩动漫HTML (1页面) HTML+CSS+JS网页设计期末课程大作业
    Java之spring新手教程(包教包会)
    PgSQL技术内幕-Bitmap Index Scan
    TraceId 搭配 ELK ,碉堡了!
    〖Python 数据库开发实战 - MySQL篇㉗〗- MySQL 数字函数
  • 原文地址:https://blog.csdn.net/qq_46106857/article/details/128148724