多线程学习笔记02Lamda表达式与静态代理

文章目录

    • 多线程学习笔记02Lamda表达式与静态代理
      • Lamda表达式
      • 静态代理

多线程学习笔记02Lamda表达式与静态代理

Lamda表达式

  • 避免匿名内部类定义过多
  • 其实质属于函式编程的概念
    (params)->expression[表达式]
    (params)->statement[语句]
    (params)->{statements}
    a->System.out.println(“i like lambda–>”+a);

new Thread(()->System.out.println(“多线程学习”)).start();

为什么要使用lambda表达式

  • 避免匿名内部类定义过多
  • 可以让代码看起来很简洁
  • 去掉一堆没有意义的代码,只留下核心逻辑

理解Functional Interface (函数式接口)是学习Java8 lambda表达式的关键所在。
函数式接口的定义:

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

推导lambda表达式:

/*
推导lambda表达式
 */
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 lambda5==>匿名内部类");
            }
        };
        like.lambda();

        //6.用lambda简化
        like = () -> {
            System.out.println("i like lambda4==>用lambda简化");
        };
        like.lambda();
    }
}

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

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

多线程学习笔记02Lamda表达式与静态代理_第1张图片
用静态内部类、局部内部类、匿名内部类实现的语句用lambda简化为like = () -> { System.out.println("i like lambda4==>用lambda简化"); };

静态内部类、局部内部类、匿名内部类可见文章《Java基础09面向对象之内部类(学习笔记 专题补充 深化理解)(非原创)》

Lambda简化:

public class TestLambda2 {

    public static void main(String[] args) {
        //1.lambda表示简化
        ILove love = (int a) -> {
            System.out.println("i love you-->" + a);
        };

        //简化1.参数类型
        love = (a) -> {
            System.out.println("i love you-->" + a);
        };

        //简化2.简化括号
        love = a -> {
            System.out.println("i love you-->" + a);
        };

        //简化3.简化花括号
        love = a -> System.out.println("i love you-->" + a);
        
        love.love(520);

    }
}

interface ILove {
    void love(int a);
}

几种简化均可正常运行
多线程学习笔记02Lamda表达式与静态代理_第2张图片

小结:

  • lambda表达式在只有一行代码的情况下才能简化为一行,如有多行代码,需用代码块包裹
  • 前提是接口为函数式接口(接口里只有一个方法)
  • 多个参数也可以去掉参数类型,要去掉就都去掉,多个参数必须加括号

静态代理

静态代理模式:
案例一:婚庆公司

//静态代理模式
public class staticProxy {
    public static void main(String[] args) {
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        weddingCompany.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("结婚之前布置现场");
    }
}


多线程学习笔记02Lamda表达式与静态代理_第3张图片

小结:

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

好处:

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

案例二:电影院

案例来源:《JAVA静态代理和动态代理理解》作者:周有才

电影是电影公司委托给影院进行播放的,但是影院可以在播放电影的时候,产生一些自己的经济收益,比如卖爆米花、可乐等,然后在影片开始结束时播放一些广告。

现在用代码来进行模拟。
首先得有一个接口,通用的接口是代理模式实现的基础。这个接口我们命名为 Movie,代表电影播放的能力。

public interface Movie {
	void play();
}

然后,我们要有一个真正的实现这个 Movie 接口的类,和一个只是实现接口的代理类。

public class RealMovie implements Movie {

    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("您正在观看电影 《肖申克的救赎》");
    }

}

这个表示真正的影片。它实现了 Movie 接口,play() 方法调用时,影片就开始播放。那么 Proxy 代理呢?

public class Cinema implements Movie {

    RealMovie movie;

    public Cinema(RealMovie movie) {
        super();
        this.movie = movie;
    }


    @Override
    public void play() {

        guanggao(true);

        movie.play();

        guanggao(false);
    }

    public void guanggao(boolean isStart) {
        if (isStart) {
            System.out.println("电影马上开始了,爆米花、可乐、口香糖9.8折,快来买啊!");
        } else {
            System.out.println("电影马上结束了,爆米花、可乐、口香糖9.8折,买回家吃吧!");
        }
    }

}

Cinema 就是 Proxy 代理对象,它有一个 play() 方法。不过调用 play() 方法时,它进行了一些相关利益的处理,那就是广告。现在,我们编写测试代码。

public class ProxyTest {

    public static void main(String[] args) {

        RealMovie realmovie = new RealMovie();

        Movie movie = new Cinema(realmovie);

        movie.play();

    }

}

运行结果:
多线程学习笔记02Lamda表达式与静态代理_第4张图片
可以看到,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

你可能感兴趣的:(Java基础,代理模式,java,开发语言)