lambda表达式简写之方法引用,引用Integer类中的toString方法,Function是数据转换的函数式接口.
//使用lambda写没问题,可以实现Integer类型转换成String类型
Function<Integer, String> function30 = t->Integer.toString(t);
//使用方法引用简化上面的代码,却编译报错
Function<Integer, String> function3 = Integer::toString;
我的分析一: toString方法的参数是int类型,于是我自定义了一个f方法,如下,结果是正常引用该方法,不会报错.说明不是int类型的问题,可以自动拆箱
Function<Integer, String> function2 = _Lambda::f;
public static String f(int i){
return Integer.toString(i);
}
我的分析二: toString方法有3个重载方法, 于是我自定义了2个重载方法去尝试,发现也没有问题不会报错
//Integer中的3个重载方法
public static String toString(int i) ;
public static String toString(int i, int radix);
public String toString()
//引用f2,不会报错,可以实现类型转换,说明不是重载的问题
Function<Integer, String> function23 = _Lambda::f2;
public static String f2(Integer i){
return Integer.toString(i);
}
public static String f2(){
return "123";
}
请问,Function<Integer, String> function3 = Integer::toString;问题出在了?为什么编译报错?求解答!
方法引用表达式
Integer::toString
可以表示引用Integer
类的toString
静态方法也可以表示引用任意
Integer
实例的toString
成员方法编译器无法判断应该使用哪个解释
你自己定义的类中最后一个f2
由于是静态的,不会有这种冲突,所以编译可以通过你自己定义的类中没有这种冲突,所以编译可以通过
以下是两个冲突的示例
编译报错信息如下
方法引用的4种类型:
ContainingClass::staticMethodName
containingObject::instanceMethodName
ContainingType::methodName
ClassName::new
注意第一种和第三种在书写形式上是一样的
表格摘自methodreferences