按布尔与Int字段排序时,Comparator.comparing方法提示无法解析如何解决?
嘿,这个问题我之前也踩过坑!你报错的核心原因是混淆了Comparable接口的compareTo方法和Comparator的用法——compareTo要求返回int类型的比较结果,但你直接return了一个Comparator对象,编译器当然找不到对应的方法啦。
下面给你两种可行的解决方案:
方案一:借助Comparator的compare方法得到结果
如果你还是想用Comparator的链式写法,只需要在最后调用compare(this, another),把当前对象和待比较对象传进去,就能得到int类型的返回值了。修改后的代码如下:
@Override public int compareTo(MyViewModel another) { return Comparator.comparing(MyViewModel::isEnabled) .thenComparingInt(MyViewModel::getPriority) .compare(this, another); }
方案二:手动实现比较逻辑(更轻量直观)
如果不想额外创建Comparator实例,也可以手动完成比较逻辑,步骤清晰还能减少对象开销:
- 先比较
enabled字段,用Boolean.compare处理布尔值的比较 - 若
enabled字段相同,再比较priority的整数值
代码示例:
@Override public int compareTo(MyViewModel another) { // 先比较enabled:默认true比false大(返回1),如果要true排在前面,就加负号 int enabledCompare = Boolean.compare(this.isEnabled(), another.isEnabled()); if (enabledCompare != 0) { return enabledCompare; // 要是想让enabled=true的排在前面,改成 return -enabledCompare; 即可 } // enabled相同,再比较priority return Integer.compare(this.getPriority(), another.getPriority()); }
两种方式都能解决问题,选哪种看个人习惯:链式写法更简洁,手动实现则更直观,性能上也略优一点。
内容的提问来源于stack exchange,提问作者BVtp
相关产品推荐
相关产品推荐

