Decimal128字段排序报错:无符合Comparable约束的类型变量U
解决Decimal128字段排序的编译错误
错误原因
你遇到的编译错误是因为Decimal128类未实现Comparable<? super U>接口,而Comparator.comparing()默认要求提取的排序键必须是可比较类型(即实现Comparable接口),因此无法自动生成比较器。
可行解决方案
方案1:直接使用Decimal128的compareTo方法指定比较逻辑
大部分Decimal128实现(比如MongoDB的org.bson.types.Decimal128)都自带compareTo方法,你可以通过Comparator.comparing()的重载方法,手动传入该方法作为比较器:
odsALSAccBalHistoryListFinal = alsBHSortLevel1 .stream() .sorted( Comparator.comparing(OdsALSAccBalHistory::getSrtCdeAccNum, Decimal128::compareTo) .thenComparing(OdsALSAccBalHistory::getYrMo, Comparator.reverseOrder())) .collect(Collectors.toList());
方案2:转换为可比较类型(如BigDecimal)后排序
如果Decimal128没有提供可用的compareTo方法,可以将其转换为已实现Comparable接口的类型(比如BigDecimal),再进行排序:
odsALSAccBalHistoryListFinal = alsBHSortLevel1 .stream() .sorted( Comparator.comparing(item -> item.getSrtCdeAccNum().bigDecimalValue()) .thenComparing(OdsALSAccBalHistory::getYrMo, Comparator.reverseOrder())) .collect(Collectors.toList());
说明
两种方案的核心都是为Decimal128字段提供明确的比较逻辑,弥补其未实现Comparable接口的不足,让Stream的sorted()方法能正确执行排序逻辑。
内容的提问来源于stack exchange,提问作者Mukul Anand
相关产品推荐
相关产品推荐

