Har*_*ngh 3 java java-8 method-reference
我最近把手放在Java 8上并尝试使用方法参考.我正在尝试不同类型的方法引用,并陷入"引用特定类型的任意对象的实例方法"类型中.
String[] arr = {"First", "Second", "Third", "Fourth"};
Arrays.sort(arr, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是当我尝试通过其类型引用用户定义类的方法时:
Demo2[] arr = {a, b};
Arrays.sort(arr, Demo2::compare);
Run Code Online (Sandbox Code Playgroud)
这将编译时错误显示为"无法从静态上下文引用非静态方法".
这是Demo2类:
public class Demo2 implements Comparator<Demo2> {
Integer i;
Demo2(Integer i1){
i = i1;
}
public Integer getI() {
return i;
}
@Override
public int compare(Demo2 o1, Demo2 o2) {
return o1.getI().compareTo(o2.getI());
}
}
Run Code Online (Sandbox Code Playgroud)
正如greg-449指出的那样,你的代码有一个bug.
通过制作方法引用,就像对实例的方法YourObjet::yourMethod进行静态引用一样.因此,将为每个对象调用该方法,因此签名需要与之前的不同
将编译的代码将具有以下形式:
Demo2[] demos = {a, b};
Arrays.sort(demos, Demo2::compareTo);
public class Demo2 {
Integer i;
Demo2(Integer i1){
i = i1;
}
public Integer getI() {
return i;
}
public int compareTo(Demo2 other) {
return this.getI().compareTo(other.getI());
}
}
Run Code Online (Sandbox Code Playgroud)
但正如RealSkeptic指出的那样,这不是实现和对象比较的正确方法.你应该给Arrays.sort方法一个比较器:
Arrays.sort(demos, (obj1, obj2) -> obj1.getI().compareTo(obj2.getI()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |