有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java比较器。comparing()函数使用lambdas和方法引用返回不同的结果

我试图使用Comparator根据字符串的长度对其进行排序。比较功能。我有以下代码:

String[] arr = new String[]{"Hello","I","Am","Learning","Java"};
  1. 当我尝试按长度的降序排序时,我使用方法引用得到了预期的结果,但它使用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
  1. 但当我按长度的递增顺序排序时,它们都会产生预期的结果:
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) 个答案

  1. # 1 楼答案

    您正在泛型比较器s->s.length()上调用泛型方法reversed(),因此当时比较器与字符串无关,因此找不到.length()(对象没有长度方法)

    您可以将s定义为字符串:

    Arrays.sort(arr, Comparator.comparing((String s)->s.length()).reversed());