![](/img/trans.png)
[英]How to call a non-static method from a non-static class using method reference in Java 8?
[英]How does java's double colon operator refer non-static method using class name
我写了这样的代码:
public class MyClass implements Comparable{
int value;
MyClass(int value){
this.value = value;
}
public static void main(String[] args) {
MyClass obj1 = new MyClass(30);
MyClass obj2 = new MyClass(5);
MyClass obj3 = new MyClass(15);
List<MyClass> classList = new ArrayList<>();
classList.add(obj1);
classList.add(obj2);
classList.add(obj3);
List<MyClass> list2 =classList.stream().sorted(MyClass::compareTo).collect(Collectors.toList());
list2.stream().forEach(x-> System.out.println(x.value));
}
@Override
public int compareTo(Object o) {
MyClass obj = (MyClass)o;
if(this.value<obj.value){
return +1;
}else return -1;
}
}
这段代码编译成功给了我预期的正确输出-
30
15
5
我有 2 个问题
我们如何使用 Myclass(classname) 引用非静态方法 compareTo? 难道我们不应该使用我的类的对象来引用 compareTo() 吗?
我们如何能够使用只接受 1 个参数的 compareTo() 方法,而sorted()
期望其抽象类compare()
接受 2 个参数的 Comparator 接口?
sorted
的 Stream 方法将Comparator<T>
作为参数。 这是一个函数式接口,因此您可以使用 lambda 表达式或方法引用作为遵循此接口的参数。 方法签名如下:
int compare(T var1, T var2);
因此,例如,以下 lambda 表达式是有效的:
(MyClass a, MyClass b) -> a.compareTo(b)
方法引用可以引用静态方法,但是在这个特定的上下文中,方法引用的类型也可以代替第一个参数,所以下面的表达式等价于上面的:
MyClass::compareTo
同样,您可以执行以下操作:
(String a, String b) -> a.equals(b)
String::equals
或者是这样的:
(String a) -> "b".equals(a)
"b"::equals
List list2 =classList.stream().sorted(MyClass::compareTo).collect(Collectors.toList());
在这一行中,您使用了仍然是流的 stream.sorted,然后您在 MyClass 中为每个流元素调用了 compareTo 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.