Comparator.comparing函数使用lambda和方法参考返回不同的结果

问题描述

我正在尝试使用Comparator.comparing函数根据字符串的长度对字符串数组进行排序。所以,我有以下代码

String[] arr = new String[]{"Hello","I","Am","Learning","Java"};
  1. 当我尝试按其长度的降序对它进行排序时,我使用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
  1. 但是当我按长度的增加顺序对它们进行排序时,它们都会产生预期的结果:
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());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...