![](/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.