Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与在Comparator.comparing()中使用方法引用相混淆_Java_Methods_Comparator_Method Reference_Functional Interface - Fatal编程技术网

Java 与在Comparator.comparing()中使用方法引用相混淆

Java 与在Comparator.comparing()中使用方法引用相混淆,java,methods,comparator,method-reference,functional-interface,Java,Methods,Comparator,Method Reference,Functional Interface,我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名相匹配 但在学习比较仪时,发现 “Comparator.comparating()”方法接受函数接口并返回一个比较器。 我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将部分(不完全)匹配函数接口签名的任何方法(作为方法引用)传递给Comparator的comparating()方法 例如,考虑下面的例子。 public class Movie

我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名相匹配

但在学习比较仪时,发现 “Comparator.comparating()”方法接受函数接口并返回一个比较器。 我知道函数接口的抽象方法必须接受一个参数并返回一个值。

但是我可以将部分(不完全)匹配函数接口签名的任何方法(作为方法引用)传递给Comparator的comparating()方法

例如,考虑下面的例子。

public class Movie {
private  String title;
private int likes;

public Movie(String title, int likes) {
    this.title = title;
    this.likes = likes;
}

public String getTitle(){
    return title;
}

public int getLikes() {
    return likes;
}
}

import java.util.Comparator;
import java.util.List;

public class Main {
public static void main(String[] args) {     
    var movies=List.of(
      new Movie("b", 20),
      new Movie("c", 30),
      new Movie("a", 10));

    var stream=movies.stream().
    sorted(Comparator.comparing(Movie::getTitle));  
    stream.forEach(m->System.out.println(m.getLikes()));
  }
}
这里,在排序的
行中(Comparator.comparing(Movie::getTitle))

如您所见,
getTitle()
方法不接受任何参数,并返回一个
字符串。但是它可以用作函数接口的方法参考(它接受一个参数并返回一个值)


为什么会这样?请回答任何人以解决我的困惑。

在类
Movie
中,
getTitle()
是一种实例方法。因此,它接受一个参数,即
Movie
(隐式参数)类型的参数。要调用方法
getTitle()
,您需要一个目标对象:

movie.getTitle();
这里,
movie
引用的对象就是一个参数


因此,
getTitle()
的函数类型是
Movie->String
,它与预期的函数接口相匹配。

“我知道函数接口的抽象方法必须接受一个参数并返回一个值”这可能是错误的,或者您没有准确地表达自己。是一个函数接口,它既不接受参数也不返回值。我认为OP表示接口的抽象方法,在这种情况下它们是正确的。所以,你是说每当我们引用实例方法时,都会有另一个参数隐藏在引擎盖下?每当你调用实例方法时,都会有一个隐式参数。