有人可以帮助我理解以下内容:
// This works fine
List list= Arrays.asList("a","b","A","B");
str.sort(String::compareToIgnoreCase);
我可以将上述方法引用分配给任何变量吗?
??? owner = String::compareToIgnoreCase;
但是我可以分配对象引用而不会出现任何问题:
String aa = "aa";
Function compareFunction = aa::compareToIgnoreCase;
预先感谢,阿卜杜勒
最佳答案
String::compareToIgnoreCase
等于匿名类:
new Comparator<String>() {
@Override
public int compare(String s, String str) {
return s.compareToIgnoreCase(str);
}
};
因此,可以将其分配给
Comparator<String>
类型的变量:Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
同时,表达式
aa::compareToIgnoreCase;
表示带有字符串参数aa
且返回Integer的函数。new Function<String, Integer>() {
@Override
public Integer apply(String str) {
return aa.compareToIgnoreCase(str);
}
};
要么:
Function<String, Integer> fun = aa::compareToIgnoreCase;
String::compareToIgnoreCase;
和aa::compareToIgnoreCase;
之间的区别在于,在第一种情况下,我们需要2个参数:将在其上调用compareToIgnoreCase
方法的字符串,以及将在此方法中传递的字符串。它与 int compare(T o1, T o2);
的签名完全匹配。在第二种情况下,您有一个参数(
aa
)。因此,您只需要一个,它将被传递到compareToIgnoreCase
中。它与 R apply(T t);
完全匹配