当前位置: 首页 > news >正文

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

在今天的项目中看到这样一行代码
Integer syncCount = consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle);
直接傻眼,无法理解consumer::handle这种用法,因此总结如下

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

1 不使用匿名方法内部类

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

interface Calculator {String showBrand(String brand);
}class BasicCalculator implements Calculator {@Overridepublic 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 改造为使用匿名方法内部类

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

interface Calculator {String showBrand(String brand);
}public class Main {public static void main(String[] args) {// new一个接口Calculator calculator = new Calculator() {@Overridepublic String showBrand(String brand) {return brand;}};String brand = calculator.showBrand("卡西欧");System.out.println("计算机品牌是: " + brand);}
}

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

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

3 改造为Lambda表达式

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

3.1 第一种风格lambda

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

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

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方法的代码如下

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

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


brand -> brand是什么,可以直接去掉吗?
答:箭头左边是参数。我们的参数是brand,这不能变动;箭头右边的是我们给参数赋予的值,看看下面的案例


3.4 第四种风格lambda

 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 改造为方法引用

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::tempSystem.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(参数),这就是自动传参的设计!

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

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() {@Overridepublic String showBrand(String brand) {return temp(brand);}};System.out.println("品牌打印: " + calculator.showBrand("卡西欧"));}
}

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

http://www.lryc.cn/news/148162.html

相关文章:

  • 本地docker registry 搭建
  • 阿里云将关停代销业务
  • 【ES6】JavaScript的Proxy:理解并实现高级代理功能
  • [Pandas] 求百分比并添加百分(%)号
  • 《算法竞赛·快冲300题》每日一题:“凑二十四”
  • git reset --hard HEAD
  • 机器人编程怎么入门?
  • 广州华锐互动:VR垃圾分类虚拟科普系统让学习过程更加丰富有趣
  • 手机盖板IR油墨透光率检测仪T03
  • ChatGPT⼊门到精通(6):ChatGPT 提问设计
  • 如何使用 Tailwind CSS 设计高级自定义动画
  • 【C语言】循环语句详解
  • SpringBoot项目配置文件数据库用户名密码加密
  • 5个IT事件管理的最佳实践
  • 双核和双路服务器的区别
  • 学习JAVA打卡第四十七天
  • Exploring Unreal Engine New Free Archviz Explorer Project 视频笔记
  • Python|爬虫和测试|selenium框架的安装和初步使用(一)
  • SAP FI之定义财务年和财务年度变式(Fiscal Year Variants)
  • 关于SAM中decomposed Relative Positional Embeddings的理解
  • 1、Spring是什么?
  • 【华为OD机试python】阿里巴巴找黄金宝箱(IV)【2023 B卷|200分】
  • 操作系统复习总结5
  • 【LeetCode】406.根据身高重建队列
  • 渗透测试漏洞原理之---【任意文件包含漏洞】
  • day28 异常
  • Pico使用C/C++选择使用哪个I2C控制器,以及SDA和SCL针脚
  • C++动态内存管理
  • SpringBoot—日志
  • 如何在,Linux中安装Luajit2.*