网站首页 > 精选教程 正文
今天是刘小爱自学Java的第48天。
感谢你的观看,谢谢你。
话不多说,开始今天的学习:
昨天回顾了函数式编程的一些概念。
今天开始学习方法引用,它是lambda表达式的进一步简化版,语法还要更加地简洁。
一、方法引用
现有一个需求:
将一个字符串信息全部转换成大写字母,再打印出来。
利用函数式编程思想编写代码。
1.lambda表达式编写
①函数式接口Printable
这是一个自定义的打印接口,有一个打印信息的抽象方法printMsg()
②lambda表达式
method方法中有两个参数,用lambda表达式表示的是接口的实现类对象。并且在lambda表达式中,业务逻辑已经写出来了。
什么叫业务逻辑?
我的理解是方法内容:根据什么参数得到了什么结果。
上述例子中就是:根据传过来的字符串消息(也就是参数msg)
结果将msg全部变成大写字母(msg.toUpperCase)
这就是业务逻辑,当然我举的这个例子非常简单,现实里肯定要复杂的多。
2.方法引用
方法引用是用来代替lambda表达式的,更加地简洁,从某种意义上来说,它们的作用其实是差不多的。
①方法引用
具体格式为:new MyPrint()::printMsg
核心是这个双冒号“::”,如何理解这个格式?
就可以理解成是MyPrint对象在调用printMsg方法。
为什么它能直接这样使用?因为它的逻辑已经存在,也就是MyPrint类中有printMsg方法以及其业务逻辑
②业务逻辑
将字符串msg全部变成大写字母,这就相当于是在MyPrint类中重写了接口中的抽象方法。
3.方法引用和lambda表达式:
现在问题来了:方法引用不是对lambda表达式的简化么?怎么感觉代码还越来越繁琐了?
我们只看①而言,方法引用要比lambda表达式简单吧?
如果我使用方法引用,该业务逻辑无论被使用多少次,我只需要写一次,其它时候直接调用;
如果我是用lambda表达式,我每调用一次就要将业务逻辑写一遍。
所以方法引用的简洁之处在于相同逻辑不需要重复地写。
这样理解下来,方法引用要比lambda表达式简洁很多,尤其是在业务逻辑很复杂的时候
当然方法引用的前提:业务逻辑已经存在。
- 如果逻辑已经存在,我直接使用方法引用即可,
- 如果逻辑不存在,还是乖乖地写lambda表达式。
二、方法引用的其它方式
上述例子中的方法引用是对象在引用方法,除了对象引用之外还有很多其它方式。
1.类名引用
如果是静态方法,直接用类名就可以调用方法。
Java底层中已经写好了很多工具类,其大多数方法都是静态方法,直接使用方法引用会方便很多。
Math是一个工具类,它有一个静态方法abs()。
所以方法引用直接用类名引用abs方法,因为其中的逻辑在Java底层就已经写好了。
类名引用格式如下:
- lambda表达式:number->Math.abs(number)
- 方法引用:Math::abs
当然这里面方法引用也有一个局限性,比如说我现在要求得到10倍的绝对值。
lambda表达式直接改业务逻辑就好了;
但是方法引用没办法,因为Java底层没有这样的业务逻辑,就算要用方法引用,我们也得先将逻辑写出来。
2.通过this引用成员方法
代码这样写并不规范,只是为了好观看,所以将它们写在一起了。
this引用格式如下:
- lambda表达式:name->this.introduce(name)
- 方法引用:this::introduce
这里面this就是代表本类,本类中已经有introduce方法了,那我用this引用的就是本类中对应的方法。
3.通过super引用成员方法
如果MyClass有个父类,它里面有一个fuIntroduce方法,若是要引用该方法,可以使用super关键字。
使用方式和this是一样的,就不再阐述了。
super引用格式如下:
- lambda表达式:name->super.fuIntroduce(name)
- 方法引用:super::fuIntroduce
super就是代表父类,父类中已经有fuIntroduce方法了,那我用super引用的就是父类中对应的方法。
4.类的构造器引用
类构造其格式如下:
- lambda表达式:name->new Person(name)
- 方法引用:Person::new
Person::new就相当于创建对象(new Person())
不要看这代码写的这么复杂,其实上就相当于new对象。
当然类的构造器这一块理解的还不算透彻,暂且只需要记住方法引用这样使用就是在创建对象就好了。
5.数组的构造器引用
数组也是Object的子类对象,所以同样具有构造器,只是语法稍有不同。
数组构造器格式如下:
- lambda表达式:length->new int[length]
- 方法引用:int[]::new
和类的构造器是一样的道理:
int[]::new就相当于创建数组(new int[length])
总结:
- 上一篇: Python中的缩进和冒号详解。初学必会
- 下一篇: java常见异常机制
猜你喜欢
- 2025-05-11 python学习笔记 1.常见的数据类型
- 2025-05-11 快速掌握Kafka系列《三》配置项总结
- 2025-05-11 3.2数据类型和变量赋值(JAVA程序员改行Python当天入门教程)
- 2025-05-11 神奇的字符串常量池
- 2025-05-11 Spring Boot(二十):RedisTemplate的序列化
- 2025-05-11 读Java性能权威指南(第2版)笔记22_ 操作系统工具和Java监控工具
- 2025-05-11 三万字总结最全Java线程池源码面试题
- 2025-05-11 linux 正则表达式(2)-扩展正则表达式
- 2025-05-11 Jenkins环境搭建和部署项目的过程
- 2025-05-11 聊聊C语言-常用运算符
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)