繁体   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