首页 > 其他分享 >2022.8.20 Lamda表达式与静态代理

2022.8.20 Lamda表达式与静态代理

时间:2022-08-20 23:56:15浏览次数:93  
标签:Lamda 20 like void lamda ILike 2022.8 println public

3、Lamda表达式

  • λ 希腊字母表中排序第十一位的字母,英语名称为 Lambda

  • 避免匿名内部类定义过多

  • 其实质属于函数式编程的概念

  • 去掉了一堆没有意义的代码,只留下核心逻辑

(params)-> expression[表达式]

(params) -> statement[语句]

[(params)-> {statements}

为什么要使用lambda表达式

  • 避免匿名内部类定义过多

  • 可以让你的代码看起来很简洁

  • 去掉了一·堆没有意义的代码,只留下核心的逻辑。

也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多了,看习惯了,就好了。

函数式接口

  • 理解Functional Interface (函数式接口) 是学习Java8 lamda表达式的关键

  • 函数式接口的定义

  • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口.

     public interface Runnable{
         public abstract void run();
     }
  • 对于函数式接口,我们可以通过Lambda表达式来创建该接口的对象.

案例

package com.xing.lambda;

/**
 * 推导lamda表达式
 */
public class TestLambda {

    public static void main(String[] args) {
        ILike like = new Like();
        like.lamda();
    }
}

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

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

优化步骤1:

package com.xing.lambda;

/**
 * 推导lamda表达式
 */
public class TestLambda {

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

    public static void main(String[] args) {
        ILike like = new Like();
        like.lamda();

        like = new Like1();
        like.lamda();
    }
}

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

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


 

优化步骤2:

package com.xing.lambda;

/**
 * 推导lamda表达式
 */
public class TestLambda {

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

    public static void main(String[] args) {
        ILike like = new Like();
        like.lamda();

        like = new Like1();
        like.lamda();



        //4.局部内部类
        class Like2 implements ILike {
            @Override
            public void lamda() {
                System.out.println("I like lamda2");
            }
        }
        like = new Like2();
        like.lamda();

    }
}

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

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


优化步骤3:

package com.xing.lambda;

/**
 * 推导lamda表达式
 */
public class TestLambda {

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

    public static void main(String[] args) {
        ILike like = new Like();
        like.lamda();

        like = new Like1();
        like.lamda();



        //4.局部内部类
        class Like2 implements ILike {
            @Override
            public void lamda() {
                System.out.println("I like lamda2");
            }
        }
        like = new Like2();
        like.lamda();


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

    }
}

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

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


最终版:

package com.xing.lambda;

/**
 * 推导lamda表达式
 */
public class TestLambda {

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

    public static void main(String[] args) {
        ILike like = new Like();
        like.lamda();

        like = new Like1();
        like.lamda();



        //4.局部内部类
        class Like2 implements ILike {
            @Override
            public void lamda() {
                System.out.println("I like lamda2");
            }
        }
        like = new Like2();
        like.lamda();


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

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

    }
}

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

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


案例2:

package com.xing.lambda;

public class TestLambda2 {
    
    public static void main(String[] args) {
        // 1.lamda
        ILove love = (int a) -> {
            System.out.println("I love you -->" + a);
        };
        love.love(520);
        
        // 2.lamda简化 去掉参数类型
        love = (a) -> {
            System.out.println("I love you -->" + a);
        };
        love.love(1314);
        
        // 3.lamda简化 去掉小括号
        love = a -> {
            System.out.println("I love you -->" + a);
        };
        love.love(1111);
        
        // 3.lamda简化  去掉大括号
        love = a -> System.out.println("I love you -->" + a);
        love.love(9999);
        /**总结:
         * {}简略的条件是只能有一行代码,多行{}就不能简略了
         * 前提是接口为函数式接口(只能有一个方法)
         * 多个参数也可以去掉参数类型,要去掉就都去掉,必须加上()
         */
    }
}

// 接口
interface ILove {
    void love(int a);
}

4、静态代理

结婚案例

package com.xing.proxy;

/**
 * 静态代理:结婚案例
 * 静态代理模式总结
 * 真实对象和代理对象都要实现同一个接口
 * 代理对象要代理真实角色
 */
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 before() {
        System.out.println("结婚之前,布置现场");
    }

    private void after() {
        System.out.println("结婚之后,收尾款");
    }
}

 

 

对比 静态代理与Thread

/**
 * 线程中的代理模式
 */
public class StaticProxy {
    public static void main(String[] args) {
        //代理Runnable接口
        new Thread(()-> System.out.println("我爱你")).start();
        
        new WeddingCompany(new You()).happyMarry();
    }
}
//WeddingCompany...上一个文件定义过了这里就直接使用了

总结

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

好处

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

标签:Lamda,20,like,void,lamda,ILike,2022.8,println,public
From: https://www.cnblogs.com/shanzha/p/16609107.html

相关文章

  • 《GB27898.3-2011》PDF下载
    《GB27898.3-2011固定消防给水设备第3部分:消防增压稳压给水设备》PDF下载《GB27898.3-2011》简介GB27898的本部分规定了消防增压稳压给水设备的术语和定义、分类、要......
  • 《GB27898.1-2011》PDF下载
    《GB27898.1-2011固定消防给水设备第1部分:消防气压给水设备》PDF下载《GB27898.1-2011》简介GB27898的本部分规定了消防气压给水设备的术语和定义、分类、要求、试验......
  • 《GB18467-2011》PDF下载
    《GB18467-2011献血者健康检查要求》PDF下载《GB18467-2011》简介本标准规定了一般血站献血者健康检查的项目和要求;本标准适用于一般血站对献血者的健康检查;不适用于......
  • 《GB27881-2011》PDF下载
    《GB27881-2011水下高电压设备作业安全要求》PDF下载《GB27881-2011》简介本标准规定了水下高电压设备作业时的人员职责、作业安全规则、维护作业准备、维护隔离与接近......
  • Codeforces 1720 D, E
    D1设\(dp(i)\)表示考虑前i个数的最长子序列。枚举\(j\),从\(dp(j)+1\)转移到\(dp(i)\),转移条件就是题中给的那个不等式。发现\(i-j\)不能超过\(300\),暴力枚举即可。时间......
  • 《GB14887-2011》PDF下载
    《GB14887-2011道路交通信号灯》PDF下载《GB14887-2011》简介本标准规定了道路交通信号灯的术语和定义、分类与型号编制规则、要求、试验方法、检验规则、铭牌和标志、......
  • Vulfocus靶场 | spring 代码执行 (CVE-2018-1273)
    漏洞描述SpringData是一个用于简化数据库访问,并支持云服务的开源框架,SpringDataCommons是SpringData下所有子项目共享的基础框架。SpringDataCommons在2.0.5及以......
  • Vulfocus靶场 | Django SQL注入(CVE-2021-35042)
    漏洞复现这题通关比较简单,但是django这个漏洞还挺出名的,之前在ctf上也遇到过相关的题目\ 直接按照提示,进入了Django报错页面 flag就在里面,直接ctrl+F就能找到......
  • Vulfocus靶场 | webmin 远程代码执行 (CVE-2019-15642)
    描述Webmin是一套基于Web的用于类Unix操作系统中的系统管理工具。Webmin1.920及之前版本中的rpc.cgi文件存在安全漏洞。攻击者可借助特制的对象名称利用该漏洞执行代码......
  • IDEA-2021.1.2版本的相关设置
    1.自动导包:File|Settings|Editor|General|AutoImport        2.忽略大小写设置:(去掉MathCase)          ......