Java多线程02:静态代理模式和Lambda表达式

Java多线程02:静态代理模式和Lambda表达式

静态代理模式

  • 真实对象和代理对象都要实现同一个接口
  • 代理对象要代理真实角色
  • 好处:
    • 代理对象可以做很多真实对象做不了的东西
    • 真实对象专注做自己的事情
  • 线程底部的实现原理

以婚庆公司代码作为实例:

package com.lurenj.thread;

public class StaticProxy {
    public static void main(String[] args) {

        new Thread(()-> System.out.println("我爱你!")).start();

//        WeddingCompany weddingCompany = new WeddingCompany(new You());
//        weddingCompany.happyMarry();
        
        //精简版
        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("结婚之前,布置现场!");
    }
}

Lambda表达式

  • 避免匿名内部类定义过多
  • 其实质属于函数式编程的概念
  • 可以让代码看起来更简洁

理解Functional Interface(函数式接口)是血迹JAVA8 lambda表达式的关键所在

函数式接口的定义:

  • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{
  public abstract void run();
}
  • 对于函数式接口,我们可以通过lambda表达式来创建该对象的接口

函数式接口—>lambda形式输出的简化历程:

package com.lurenj.thread;

public class TestLambda1 {

    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("I like lambda2");
        }
    }


    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("I like lambda3");
            }
        }
        like = new Like3();
        like.lambda();

        //5.匿名内部类
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println("I like lambda4");
            }
        };
        like.lambda();


        //6.lambda简化
        like = ()->{
            System.out.println("I like lambda5");
        };
        like.lambda();
        
    }
}

//1.定义一个函数式接口
interface ILike{
    void lambda();
}

//2.实现类
class Like implements ILike{
    @Override
    public void lambda() {
        System.out.println("I like lambda");
    }
}

实例2,接口中定义有参函数时,从函数接口—>lambda的简化及lambda的精简

package com.lurenj.thread;

public class TestLambda2 {

    //3.静态内部类
    static class Love1 implements ILove{
        @Override
        public void love(int a, int b) {
            System.out.println("I love you---->" + a + b);
        }
    }


    public static void main(String[] args) {
        ILove love = new Love();
        love.love(1,520);
        love = new Love1();
        love.love(2,520);
        //4.局部内部类
        class Love2 implements ILove{
            @Override
            public void love(int a, int b) {
                System.out.println("I love you---->" + a + b);
            }
        }
        love = new Love2();
        love.love(3,520);

        //5.匿名内部类
        love = new ILove() {
            @Override
            public void love(int a, int b) {
                System.out.println("I love you---->" + a + b);
            }
        };
        love.love(4,520);

        //6.lambda表达式简化
        love = (int a, int b)->{
            System.out.println("I love you---->" + a + b);
        };
        love.love(5,520);

        //7.继续简化,(1)去掉参数类型
        love = (a,b)->{
            System.out.println("I love you---->" + a + b);
        };
        love.love(6,520);

        //8.继续简化,(2)去掉参数类型和括号
        love = (a,b)->{
            System.out.println("I love you---->" + a + b);
        };
        love.love(7,520);
        //9.继续简化,(2)去掉参数类型、括号和花括号
        love = (a,b)->System.out.println("I love you---->" + a + b);
        love.love(8,520);
        /*
        1.lambda表达式只能有一行的代码的情况下才能简化成为一行,如果有多行,就需要用代码块包裹
        2.必须是函数式接口
        3.多个参数也可以去掉参数类型,要去掉都去掉,必须加上括号
         */

    }
}
//1.定一个函数式接口
interface ILove{
    void love(int a, int b);
}
//2.实现类
class Love implements ILove{
    @Override
    public void love(int a, int b) {
        System.out.println("I love you---->" + a + b);
    }
}
posted @   lurenj  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示