静态代理、Lamda表达式

本文介绍了静态代理模式的应用及其实现方式,并通过实例展示了如何使用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("结婚之前,布置现场");
    }
}

在这里插入图片描述

好处:代理对象可做很多真实对象做不了的事情

Lambda表达式

如果接口只包含唯一一个抽象,那么它就是一个函数式接口;对于函数式接口,可以通过lambda表达式来创建该接口的对象

public class testLambda1 {
    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("I Like 2");
        }}
    public static  void main(String[] args) {

        ILike like = new Like();//接口去new一个实现类
        like.lambda();

        Like2 like2 = new Like2();
        like2.lambda();

        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("I Like 3");
            }}
        Like3 like3 = new Like3();
        like3.lambda();

        //匿名内部类,没有类的名称,必须借助接口或者父类
        like =new ILike() {
            @Override
            public void lambda() {
                System.out.println("I Like 4");
            }
        };
        like.lambda();

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

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

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

只有一个接口和一个实现类,1到6是逐步简化过程。上面就是一个函数式接口,可用lambda简化

下面是带参数的

public class testLambda2 {
    public static void main(String[] args) {
        ILove love = new Love();
        love.love(2);
    }
}
interface ILove{
    void love(int a);
}

class Love implements ILove{
    @Override
    public void love(int a) {
        System.out.println("I love you-->"+a);
    }
}

public class testLambda2 {
    public static void main(String[] args) {
        ILove love = null;
        /*
        ILove love = (int a)->{
            System.out.println("I love you"+a);
        };
        //类型简化
        love = (a)-> {
            System.out.println("I love you"+a);
        };
        //简化括号
        love = a->{
            System.out.println("I love you"+a);
        };
        //去掉花括号

         */
        love =a->System.out.println("I love you"+a);

        love.love(521);
    }
}
interface ILove{
    void love(int a);
}

class Love implements ILove{
    @Override
    public void love(int a) {
        System.out.println("I love you-->"+a);
    }
}

是一样的(输出为521)

最后能去掉花括号的原因是代码只有一行

lambda表达式实现前提一定是函数式接口

多个参数也可以去掉参数类型,要去掉就都去掉,加上括号

Lambda表达式是Java 8中引入的一个重要特性,允许开发者以更简洁的方式编写函数式代码,可将其理解为一段可以传递的代码,能把函数作为一个方法的参数,这种更紧凑的代码风格提升了Java的语言表达能力[^1][^2]。 在JavaScript等其他语言中也有类似概念,虽然形式有所不同,但核心思想一致。Lambda表达式有一定的限制,要么返回一个值,要么执行一段方法,且不能包含变量、赋值或语句,如if或for。若要进行更复杂的操作,可使用带有花括号的代码块,若需要返回值,代码块中应有return语句,其语法格式为`(parameter1, parameter2) -> { code block [return] }` [^3][^4]。 以下是Java中Lambda表达式的代码示例: ```java @FunctionalInterface public interface Consumer<T> { void accept(T var1); default Consumer<T> andThen(Consumer<? super T> after) { java.util.Objects.requireNonNull(after); return (t) -> { this.accept(t); after.accept(t); }; } } public class LambdaClass { public static void main(String[] args) { Consumer<String> con = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; con.accept("3333"); Consumer<String> con1 = s -> System.out.println(s); con1.accept("aaaa"); Consumer<String> con2 = System.out::println; con2.accept("bbb"); } } ``` 在上述代码中,`con1`使用了Lambda表达式来实现`Consumer`接口的`accept`方法,比传统的匿名内部类`con`的写法更加简洁;`con2`则使用了方法引用,也是Lambda表达式的一种应用形式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值