You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:03:34