我是一名自学型开发人员,现在正在学习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
。但它可以用作函数接口的方法引用(它接受一个参数并返回一个值)。
为什么会这样?请回答任何人来解决我的困惑。
在类中,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()进行比较。我有几个例子。有人能帮我更好地理解这一点吗?