网站首页 > 精选教程 正文
:: 双冒号在工作中经常能碰到,但不一定能叫上名字,它在Java中有个专业名词叫方法引用(Method References)。那方法引用具体是什么呢?
方法引用是什么
方法引用是Java 8随着Lambda表达式引入的新特性,它是仅包含一个方法调用的Lambda表达式的简写语法。它的作用是通过名称引用一个现有方法。与Lambda表达式相比,它紧凑、易于阅读。
如果使用方法引用,方法体只能有一个简单语句
List<String> messages = Arrays.asList("hello", "suncodernote", "methodrefernce");
messages.forEach(s -> {
System.out.println(s);
});
就像上面这段代码一样,方法体中只有一个System.out.println(s)语句
用方法引用简化上面的代码:
messages.forEach(System.out::println);
方法引用的种类
方法引用有以下4种类型:
- 静态方法引用
- 特定对象的方法引用
- 特定类的任意对象的方法引用
- 构造方法引用
下面用举个例子来说明一下这4种方法引用。
静态方法引用
静态方法引用就是通过方法引用调用静态方法。
如果使用Lambda表达式引用静态方法,格式大概是这样的(args) -> Class.staticMethod(args)
如果使用静态方法引用,格式是这样的Class::staticMethod
举个例子:
先创建一个User实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Integer age;
/**
* 比较年龄
*/
public static int compareByAge(User a , User b){
return a.getAge().compareTo(b.getAge());
}
/**
* 创建对象
*/
public static User createUser(Supplier<User> userSupplier){
return userSupplier.get();
}
}
测试类
public class MethodReferenceTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(10));
userList.add(new User(5));
userList.add(new User(8));
// 引用User静态方法compareByAge
userList.sort(User::compareByAge);
System.out.println(userList);
}
}
输出结果:
[User(age=5), User(age=8), User(age=10)]
特定对象的方法引用
引用特定对象的实例方法。
如果使用Lambda表达式引用特定对象的方法,格式大概是这样的(args) -> obj.instanceMethod(args)
如果使用方法引用,格式是这样的obj::instanceMethod
举个例子:
新建一个User类的比较器类UserComparator比较用户的年龄age
public class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return o1.getAge().compareTo(o2.getAge());
}
}
测试类
public class MethodReferenceTest {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(10));
userList.add(new User(5));
userList.add(new User(8));
UserComparator userComparator = new UserComparator();
// 引用userComparator对象的compare方法
Collections.sort(userList, userComparator::compare);
}
}
特定类的任意对象的方法引用
对特定类型任意对象的实例方法的引用。
如果使用Lambda表达式引用特定类型任意对象的实例方法,格式大概是这样的(obj, args) -> obj.instanceMethod(args)
如果使用方法引用,格式是这样的ObjectType::instanceMethod
举个例子:
public class MethodReferenceTest {
public static void main(String[] args) {
List<String> messages = Arrays.asList("hello", "suncodernote", "methodrefernce");
//引用String 类的实例方法compareToIgnoreCase
Collections.sort(messages, String::compareToIgnoreCase);
messages.forEach(System.out::println);
}
}
构造方法引用
构造方法引用返回一个Supplier<T>对象,通过supplier.get()方法就可以获取到真正的对象。构造方法引用跟上面3个相比属于特例了,因为它没有直接调用已经存在的方法,而是跟了new关键字。
如果使用Lambda表达式引用构造方法,格式大概是这样的(args) -> new ClassName(args)
如果使用方法引用,格式是这样的ClassName::new
举个例子:
// 创建一个User类对象
User user = User.createUser(User::new);
列表总结一下4种方法引用的格式:
种类 | 语法 | 示例 |
静态方法引用 | ContainingClass::staticMethodName | User::compareByAge |
构造方法引用 | ClassName::new | User::new |
特定对象的方法引用 | containingObject::instanceMethodName | userComparator::compare |
特定类的任意对象的方法引用 | ContainingType::methodName | String::compareToIgnoreCase |
总结
方法引用是Java 8随着Lambda表达式引入的新特性,可能有些同学还不习惯这种编码方式,不过还好IDE可以提示我们简化或者通过IDE的功能直接转成Lambda和方法引用以简化代码。
猜你喜欢
- 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语言-常用运算符
你 发表评论:
欢迎- 06-30【AI绘永昌】风景篇(二)(永昌图文)
- 06-30AI风景建筑图集(ai景观平面图)
- 06-30AI绘制精美绚丽的景色(ai绘制图案)
- 06-30AI风景,不存在的地方又增加了(ai风景插画作品)
- 06-301 分钟解锁!运用 DS + 即梦 + 豆包,轻松打造个性化风景音乐短视频
- 06-30美景欣赏 #AI绘画#(美景图画)
- 06-30AI动漫风景图集1 ~(ai动漫图片)
- 06-30原图壁纸,ai绘画风景(原图壁纸下载)
- 最近发表
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)