使用反转比较器排序Java Stream出现编译错误如何解决
问题原因
代码编译失败的根源是Java泛型类型推断失效:在Comparator.comparing()后链式调用reversed()时,编译器无法自动识别lambda表达式中word参数的类型,最终触发类型匹配错误。
可用修复方案
以下三种写法都可以解决编译问题,实现按字符串长度倒序排序的需求:
- 显式指定lambda参数类型,辅助编译器完成类型推断
courses.stream() .sorted(Comparator.comparing((String word) -> word.length()).reversed()) .forEach(System.out::println);
- 改用方法引用传递长度提取逻辑,规避类型推断异常
courses.stream() .sorted(Comparator.comparing(String::length).reversed()) .forEach(System.out::println);
- 使用针对基础类型int优化的
comparingInt方法,无装箱开销,类型推断稳定性更高,是优先推荐的写法
courses.stream() .sorted(Comparator.comparingInt(String::length).reversed()) .forEach(System.out::println);
注:如果需要长度相同的元素完全匹配你给出的预期顺序,可以在长度比较规则后追加第二排序规则即可,例如
.thenComparing(Comparator.naturalOrder())或自定义同长度下的排序逻辑。
内容的提问来源于stack exchange,提问作者Andres Ramirez
相关产品推荐
相关产品推荐

