匿名内部类、Lambda、方法引用 的总结

在今天的项目中看到这样一行代码
Integer syncCount = consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle);

直接傻眼,无法理解consumer::handle这种用法,因此总结如下

consumer::handle这种写法叫做什么?

答:Java8的一个特性,即方法引用,可以简化代码量。当提及方法引用的时候,为了方便理解这个陌生的概念,因此简单介绍一个匿名方法内部类,lambda表达式。

1 不使用匿名方法内部类

这个例子应该是我们最为熟悉的写法:创建接口,实现实现类,调用实现类

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

class BasicCalculator implements Calculator {
    @Override
    public String showBrand(String brand) {
      	return brand;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new BasicCalculator();
        String brand= calculator.showBrand("卡西欧");
        System.out.println("计算机品牌是: " + brand);
    }
}

2 改造为使用匿名方法内部类

接下来就让我们改造一下这块代码,使用匿名方法内部类试试

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

public class Main {
    public static void main(String[] args) {
    	// new一个接口
        Calculator calculator = new Calculator() {
            @Override
    		public String showBrand(String brand) {
      	    return brand;
            }
        };

        String brand = calculator.showBrand("卡西欧");
        System.out.println("计算机品牌是: " + brand);
    }
}

对比正常的写法可以发现,这样一改造,就不需要创建一个实现类了。

【具体的信息参考此文链接,点击查看】

3 改造为Lambda表达式

从理解上,匿名内部类的思想,确实让人有简化了代码的感觉,但从示例代码量上看,并没有减少很多。

那再使用Lambda表达式试试

3.1 第一种风格lambda

这一种风格是常用的,后面的都不习惯那样写,了解即可。

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

 public static void main(String[] args) {
        Calculator calculator = brand -> showBrand(brand);
        String name = calculator.showBrand("卡西欧");
        System.out.println("品牌打印: " + name);
    }

3.2 第二种风格lambda

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

public class Main {
    public static void main(String[] args) {
    
       Calculator calculator = brand -> "Brand: " + brand;

       String name = calculator.showBrand("卡西欧");
       System.out.println("品牌打印: " + name);
    }
}

打印结果是:品牌打印:Brand:卡西欧

3.3 第三种风格lambda

那我不想要输出结果含有 Brand:,main方法的代码如下

java 复制代码
 public static void main(String[] args) {
 
       Calculator calculator = brand -> brand;

       String name = calculator.showBrand("卡西欧");
       System.out.println("品牌打印: " + name);
    }

打印结果:品牌打印:卡西欧


brand -> brand是什么,可以直接去掉吗?

答:箭头左边是参数。我们的参数是brand,这不能变动;箭头右边的是我们给参数赋予的值,看看下面的案例


3.4 第四种风格lambda

java 复制代码
 public static void main(String[] args) {
        Calculator calculator = brand -> "Iphone 14";
        String name = calculator.showBrand("卡西欧");
        System.out.println("品牌打印: " + name);
    }

打印结果是:品牌打印:Iphone 14

为什么会这样,是因为我们brand -> "Iphone 14"定义后,参数就写死了,后续calculator.showBrand("卡西欧")的参数 卡西欧失效了


接下来的这个案例,希望告诉大家方法引用的用法和用途。不要再继续关注如何简化代码,先看看怎么使用方法引用吧

4 改造为方法引用

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

public class Main {
    public static String temp(String schoolName) {
        return schoolName;
    }

    public static void main(String[] args) {
    	Calculator calculator = Main::temp
        System.out.println("品牌打印: " + calculator.showBrand("卡西欧"));
    }
}

结果输出

品牌打印: 卡西欧

Main::temp是什么意思?

答:类名::方法名,表示调用Main类下的temp方法

Calculator calculator = Main::temp是什么意思?

答:关联到Calculator接口或者类中

calculator.showBrand("卡西欧")是什么意思?

答案:表面上是在调用 Calculator 类中的 showBrand()方法,因为temp()已经绑定了Calculator类

所以会比对showBrand()方法和temp()的返回值类型:Sting、 参数个数:1 、 参数返回值类型:String

满足这些条件后,将会执行如下过程

首先,参数(卡西欧)传入 showBrand方法中

其次,参数(卡西欧)传入 temp方法中

然后, temp方法返回值是 (卡西欧)

最后,打印结果

这样有个什么好处呢,我们仅仅给showBrand(参数)传入参数,就实现了参数自动传给temp(参数),这就是自动传参的设计!

此时我们将这个案例修改为使用匿名方法内部类的样式

java 复制代码
interface Calculator {
    String showBrand(String brand);
}

public class Main {
    public static String temp(String schoolName) {
        return schoolName;
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator() {
            @Override
            public String showBrand(String brand) {
                return temp(brand);
            }
        };

        System.out.println("品牌打印: " + calculator.showBrand("卡西欧"));
    }
}

通过本文,可以直观的感受很简单的应用方法引用的写法,下次在遇到时候,可以凭借此基础再理解企业代码如何写的。也可以当作优化自己的代码写法的思路。

相关推荐
运维行者_7 分钟前
OPM 与传统管理工具的区别,在网络修复与自动化运维方面的优势在哪里?
运维·服务器·开发语言·网络·自动化·php·ssl
广州灵眸科技有限公司31 分钟前
瑞芯微(EASY EAI)RV1126B 音频输入
linux·开发语言·网络·音视频
qq_124987075343 分钟前
基于微信小程序的电子元器件商城(源码+论文+部署+安装)
java·spring boot·spring·微信小程序·小程序·毕业设计
吃喝不愁霸王餐APP开发者1 小时前
基于Spring Cloud Gateway实现对外卖API请求的统一鉴权与流量染色
java·开发语言
a努力。1 小时前
美团Java面试被问:Redis集群模式的工作原理
java·redis·后端·面试
一雨方知深秋1 小时前
面向对象编程
java·封装·this·构造器·static关键字·成员变量·javabean实体类
资生算法程序员_畅想家_剑魔1 小时前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
计算机程序设计小李同学2 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
心疼你的一切2 小时前
三菱FX5U PLC与C#通信开发指南
开发语言·单片机·c#
程序员阿鹏2 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式