簡體   English   中英

java的雙冒號運算符如何使用類名引用非靜態方法

[英]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 個問題

  1. 我們如何使用 Myclass(classname) 引用非靜態方法 compareTo? 難道我們不應該使用我的類的對象來引用 compareTo() 嗎?

  2. 我們如何能夠使用只接受 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM