方法引用--java8

本文详细介绍了Java中的方法引用,包括对象::非静态方法、类::静态方法和类::非静态方法三种情况,并通过实例展示了它们的使用。方法引用本质上是lambda表达式的简化形式,适用于已有方法实现的场景。总结了方法引用的使用要求,强调了参数列表和返回值类型的匹配性。
摘要由CSDN通过智能技术生成

概述

方法引用的本质是lambda表达式,使用场景为当要传递给lambda体的操作已经有实现的方法时,可以使用方法引用。
具体可以分为三种情况:

  • 对象::非静态方法
  • 类::静态方法
  • 类::非静态方法

对象::非静态方法

以Consumer中的void accept(T t)方法和PrintStream中的void println(T t)方法为例,两者参数类型以及返回值类型均相同(这里没有返回值)。
测试方法如下:

//lambda
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("lambda");

System.out.println("---------------------");

//方法引用
//System.out返回的是一个PrintStream对象
Consumer<String> con2 = System.out::println;
con2.accept("methodRef");

结果如下:

lambda
---------------------
methodRef

类::静态方法

以Comparator中的int compare(T t1,T t2)方法和Integer中的int compare(T t1,T t2)静态方法为例,两者参数类型和返回值类型均相同
测试方法如下:

//lambda
Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
System.out.println(com1.compare(1, 2));

System.out.println("---------------------------");

//方法引用
Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(1, 2));

结果如下:

-1
---------------------------
-1

类::非静态方法

此种情况和前两种参数列表和返回值类型都相同的情况不一样,个人觉得比较难以理解。
以Comparator中的int compare(T t1,T t2)方法和String中的int t1.compareTo(t2)方法为例,由于String中compareTo为非静态方法,只能由t1这个字符串对象调用。
测试方法如下:

//lambda
Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);
System.out.println(com1.compare("ab", "ac"));

System.out.println("--------------------------");

//方法引用
Comparator<String> com2 = String::compareTo;
System.out.println(com2.compare("ab", "ac"));

结果如下:

-1
--------------------------
-1

可以发现这里两个方法虽然参数列表不同,但是仍然可以引用,而且如果按照前两种情况理解,由类调用非静态方法也是不合法的,比较奇怪。个人理解为类::非静态方法,这种情况是将第一个参数作为调用非静态方法的对象,后面的参数则作为方法的参数列表。

总结

方法引用使用要求:

  1. 针对情况1和情况2,要求接口中的抽象方法的形参列表和返回值类型,与方法引用的方法的形参列表和返回值类型形同
  2. 对于情况3,方法引用的第一个参数是调用方法的对象,后续参数列表需要与方法的参数列表一致。当然返回值必须一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值