Java 17中Comparator.comparingDouble报错问题咨询
问题分析与解决
错误原因
你遇到的类型不匹配错误,本质是用错了Comparator.comparingDouble的参数类型:
Comparator.comparingDouble()方法要求传入ToDoubleFunction<? super T>,也就是一个能把Video对象转换成double数值的函数(比如video -> 计算出的好评率),它会基于这个数值自动生成对应的Comparator。- 但你传入的是一个已经定义好的
Comparator<Video>对象,这和方法要求的参数类型完全不兼容,所以编译器报错说找不到合适的类型让两者匹配。
两种修复方案
方案1:直接使用已定义的Comparator
既然你已经写好了完整的videoPercentLikeComparator,直接把它传给videos.sort()即可,不需要再套comparingDouble:
@Override public void sort(List<Video> videos) { videos.sort(videoPercentLikeComparator); }
方案2:用comparingDouble简化实现
如果想利用comparingDouble的简洁性,可以把原来的Comparator逻辑改成ToDoubleFunction,让方法帮你生成Comparator:
public static class SortByPercentLike implements VideoSorterInterface { @Override public void sort(List<Video> videos) { videos.sort(Comparator.comparingDouble(video -> ((video.getLike() - video.getDislike()) / (double) video.getView()) )); } }
这样既省去了单独定义Comparator变量的步骤,也完全符合comparingDouble的参数要求。
额外补充:如果需要降序排序(比如把好评率高的视频放在前面),可以在调用链后追加.reversed():
videos.sort(Comparator.comparingDouble(video -> ((video.getLike() - video.getDislike()) / (double) video.getView()) ).reversed());
内容的提问来源于stack exchange,提问作者OzanCinci
相关产品推荐
相关产品推荐

