当前位置: 首页 > 知识库问答 >
问题:

与在比较器中使用方法参考相混淆。比较()[重复]

史宸
2023-03-14

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

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

但是我可以将任何部分(而不是完全)匹配Function接口签名的方法(作为方法参考)传递给比较器的比较()方法。

例如,考虑以下示例。

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()方法不接受参数并返回String。但它可以用作函数接口的方法引用(它接受一个参数并返回一个值)。

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

共有1个答案

章飞章
2023-03-14

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

movie.getTitle();

这里电影引用的对象是一个参数。

getTitle()的函数类型因此是Movie-

 类似资料:
  • 问题内容: 我对分配给False,True的测试值感到困惑 要检查真实值,我们只需 假怎么样? 问题答案: 从Python样式指南中: 对于序列(字符串,列表,元组),请使用空序列为假的事实。 [..] 不要使用==将布尔值与True或False进行比较。

  • Java8中的类定义了一个方法,该方法需要一个参数。下面是方法签名: 在Java8中,下面的代码可以很好地工作。但是,我预计会出现类似“Integer类没有定义compareTo(Integer,Integer)”这样的编译错误。 有人能解释为什么可以将的实例传递给需要实例的方法,尽管它们的方法签名不兼容?

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 我正在实现插入排序方法。这是我的代码要求。 方法insertionSort是一个不返回任何内容的静态方法 它有两个参数:通用数组和比较器(通用) 它使用合并排序算法对泛型数组进行排序 我的问题是:调用main方法时,比较器参数c使用什么? 到目前为止,我有一些未实现的方法(merge sort an isAnagaram)忽略这些 我环顾了一下堆栈溢出,并在比较器界面上搜索了很多,但我真的找不到任

  • 我读了这篇文章,当我们应该在字符串常量上使用字符串的实习生方法时,但仍然不太清楚String==也与intern()进行比较。我有几个例子。有人能帮我更好地理解这一点吗?