问题描述
我正在尝试使用Comparator.comparing函数根据字符串的长度对字符串数组进行排序。所以,我有以下代码:
String[] arr = new String[]{"Hello","I","Am","Learning","Java"};
- 当我尝试按其长度的降序对它进行排序时,我使用Method reference获得了预期的结果,但使用lambda即
Cannot resolve method length()
给出了编译时错误(CTE):
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
那么,为什么在第一个使用lambda的情况下IntelliJ抛出CTE,而方法引用可以在涉及单个方法调用的情况下替换lambda,因此理想情况下它们应该表现相同?
此外,为什么上述CTE需要替换为
Comparator.comparing((String s) -> s.length()).reversed()
解决方法
您是在通用比较器reversed()
上调用通用方法s->s.length()
,因此,此时的Comparator与字符串无关,因此找不到.length()
(对象没有长度法)
您可以将s
定义为字符串:
Arrays.sort(arr,Comparator.comparing((String s)->s.length()).reversed());