Java学习记录 Day21(静态代理、Lambda表达式)
原创
©著作权归作者所有:来自51CTO博客作者赈川_Mxt的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
Day 21
2019年6月1日。
这是我学习Java的第二十一天。
这一天,我学到了以下的知识。
静态代理
静态代理,是一种设计模式。
静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能。
以下面为示例:
- 你(RealSubject):真实角色
- 婚庆公司(Proxy):代理角色,代理你,帮你处理结婚的事
- 结婚(Subject):接口,实现结婚接口即可
//静态代理
public class StaticProxy {
public static void main(String[] args) {
//代理对象 代理 真实对象
You you = new You();
new WeddingCompany(you).happyMarry();
}
}
//真实对象:你
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("b");
}
}
//代理对象:婚庆公司
class WeddingCompany implements Marry{
//核心:婚庆需要有你这个人,代理对象需要代理一个真实对象
private Marry you;
public WeddingCompany(Marry you) {
this.you = you;
}
@Override
public void happyMarry() {
before();
this.you.happyMarry();
after();
}
private void before() {
System.out.println("a");
}
private void after() {
System.out.println("c");
}
}
//共同的接口:结婚
interface Marry{
void happyMarry();
}
Lambda表达式
Lambda表达式,是一个匿名函数。Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
Lambda表达式是jdk8新增的概念,必须用在函数式接口上(接口中只有一个抽象方法),是匿名内部类的转化形式,需要有返回值来让JVM辨认是哪个接口。若只传递一个参数,还可以简化参数类型和括号。若方法体只有一行,则可以省略花括号。
Lambda格式如下:
范例如下:
public class LambdaTest {
public static void main(String[] args) {
//实现方式1:匿名内部类
ILove iLove = new ILove() {
@Override
public void Love(int a) {
System.out.println(a);
}
};
iLove.Love(1);
//实现方式2:Lambda表达式完整格式
iLove =(int a) -> {
System.out.println("2");
};
iLove.Love(2);
//实现方式3:Lambda表达式缩减格式(省略变量类型)
iLove = a -> {
System.out.println("3");
};
iLove.Love(3);
//实现方式4:Lambda表达式缩减格式(省略变量类型、花括号)
iLove = a -> System.out.println("4");
iLove.Love(4);
}
}
//函数式接口,只有一个方法
interface ILove{
void Love(int a);
}