java比较器。comparing()函数使用lambdas和方法引用返回不同的结果
我试图使用Comparator根据字符串的长度对其进行排序。比较功能。我有以下代码:
String[] arr = new String[]{"Hello","I","Am","Learning","Java"};
- 当我尝试按长度的降序排序时,我使用方法引用得到了预期的结果,但它使用lambda给出了编译时错误(CTE),即
Cannot resolve method length()
:
Arrays.sort(arr, Comparator.comparing(String::length).reversed()); //Using method reference Arrays.sort(arr, Comparator.comparing(s->s.length()).reversed()); //Using Lambda CTE
- 但当我按长度的递增顺序排序时,它们都会产生预期的结果:
Arrays.sort(arr, Comparator.comparing(String::length)); //Using method reference Arrays.sort(arr, Comparator.comparing(s->s.length())); //Using Lambda
那么,为什么IntelliJ在第一个使用lambdas的场景中抛出CTE,而在涉及单个方法调用的场景中,方法引用可以替代lambdas,所以理想情况下它们的行为应该相同
此外,为什么上述CTE需要替换为
Comparator.comparing((String s) -> s.length()).reversed()
# 1 楼答案
您正在泛型比较器
s->s.length()
上调用泛型方法reversed()
,因此当时比较器与字符串无关,因此找不到.length()
(对象没有长度方法)您可以将
s
定义为字符串: