方法引用,引用一个非静态方法时,应该加一个new关键字吧
Topic source那个方法调用是这个东西的简写
public class Program { public static void main(String[] args) { String[] array = new String[]{"apple", "orange", "banana", "lemon"}; Arrays.sort(array, (s1,s2)-> s1.compareTo(s2)); System.out.println(String.join(", ", array)); }}
您的代码我运行了,如果方法引用引用的是实例方法,且新实例方法参数签名与原有方法参数签名一致的话,需要。
new Main()::compareTo
您的讨论不在老师教程范围里面,属于引用实例方法但参数签名一致的情况。
public class Main { static int cmp(String s1, String s2) { return s1.compareTo(s2); } public int compareTo(String s1, String s2) { return s1.toLowerCase().compareTo(s2.toLowerCase()); } public static void main(String[] args) { String[] array = new String[] { "apple", "Orange", "banana", "Lemon" }; Arrays.sort(array, (o1, o2) -> //官方文档把实例方法引用分为未绑定方法引用和绑定方法引用 // 未绑定方法引用:调用方法的实例是入参的情况,语法格式:(arg0, rest) -> arg0.instanceMethod(rest)和RefType::instanceMethod // 绑定方法引用:调用方法的实例是在实现接口方法体内部创建的,语法格式:(args) -> expr.instanceMethod(args)和expr::instanceMethod //1.调用compareTo()方法的是入参o1,所以可以写成String::compareTo o1.compareTo(o2) //2.调用compareTo()方法的是表达式new Main(),所以要写成new Main()::compareTo// new Main().compareTo(o1, o2) //3.静态方法引用是 RefType::staticMethod和(args) -> RefType.staticMethod(args),所以写成Main::cmp// Main.cmp(o1, o2) ); System.out.println(String.join(", ", array)); }}
官方文档把实例方法引用分为 未绑定方法引用 、绑定方法引用、静态方法引用
public class Main {
static int cmp(String s1, String s2) {
return s1.compareTo(s2);
}
public int compareTo(String s1, String s2) {
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
public static void main(String[] args) {
String[] array = new String[] { "apple", "Orange", "banana", "Lemon" };
// 1.未绑定方法引用:调用方法的实例是入参的情况,语法格式:(arg0, rest) -> arg0.instanceMethod(rest) 可以简写为 RefType::instanceMethod
Arrays.sort(array, (o1, o2) -> o1.compareTo(o2));
Arrays.sort(array, String::compareTo);
// 2.绑定方法引用:调用方法的实例是在实现接口方法体内部创建的,语法格式:(args) -> expr.instanceMethod(args) 可以简写为 expr::instanceMethod
Arrays.sort(array, (o1, o2) -> new Main().compareTo(o1, o2));
Arrays.sort(array, new Main()::compareTo);
// 3.静态方法引用是(args) -> RefType.staticMethod(args) 可以简写为 RefType::staticMethod
Arrays.sort(array, (o1, o2) -> Main.cmp(o1, o2));
Arrays.sort(array, Main::cmp);
}
}
String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };
Arrays.sort(array, String::compareTo);
第一行代码不是已经new 过了吗?这里的compareTo就是调用数组里面字符串对应的compareTo函数阿。
public static void main()
{
....
}
有没有可能你需要new Main是因为你在一个静态函数里面去访问实例的非静态方法呢?
静态函数可没有this指向的实例阿。你想要在静态函数里访问实例的非静态方法可不得new一个。
- 1
- 2
SNH48-刘慈欣
我也晕了。
应该是:
如果你定义的是实例方法CompareTo(Object o),那么它有隐含参数this。另外如果把你上面那个改称实例方法CompareTo(Object o),也无法传入Main::CompareTo,因为this所指向的实例是Main类,而Comparator<String>里的compareTo需要的参数是String类。