thenComparing 中的错误不适用于参数 Comparator<..DTO>

Error in thenComparing is not applicable for the arguments Comparator<..DTO>

所以我在 thenComparing 行中遇到错误,我不知道发生了什么。谁能帮帮我?

List<CognodataEstadoSolicitudesDTO> solicitudes 
else if ("columnaFechaSolicitud".equals(orderBy)) {
                    solicitudes = solicitudes.stream().sorted(Comparator.comparing(t -> {
                        Date fecha = null;
                        try {
                            fecha= ((CognodataEstadoSolicitudesDTO) t).getFechaSolicitudToDate();
                        } catch (ParseException e) {
                                LOG.error(e.getMessage());
                        }
                        return fecha;
                    }).thenComparing(Comparator.comparing(CognodataEstadoSolicitudesDTO::getIdSolicitud))).collect(Collectors.toList());
            

这是编译器无法跨多个级别(lambda、比较器和流)正确推断泛型类型和包括边界(基本上是 2 个嵌套 ? super T)的问题,因此您需要帮助它通过在 lambda 中声明类型:

 solicitudes.stream()
            .sorted(Comparator.comparing((CognodataEstadoSolicitudesDTO t) - { ... })
               .thenComparing(CognodataEstadoSolicitudesDTO::getIdSolicitud))
            .collect(Collectors.toList());

在这里,您将密钥提取器定义为 Function<CognodataEstadoSolicitudesDTO , ?>,因此编译器知道 comparing(Function<CognodataEstadoSolicitudesDTO , ?> keyExtractor) 将返回 Comparator<CognodataEstadoSolicitudesDTO>

在第一个 Comparator.comparing 中使用 lambda 似乎是多余的,并且在排序到相同的 solicitudes 变量后重新分配列表。

使用方法List::sort accepting a comparator and handle possible nulls using Comparator::nullsLast

可能会更好
solicitudes.sort(
    Comparator.comparing(
        CognodataEstadoSolicitudesDTO::getFechaSolicitudToDate, 
        Comparator.nullsLast(Comparator.naturalOrder())
    )
    .thenComparing(CognodataEstadoSolicitudesDTO::getIdSolicitud)
);

但是,如果确实需要使用初始代码中提到的lambda,则必须为lambda参数指定被比较对象的类型,并且仍然需要处理返回的null如果 ParseException:

solicitudes.sort(
        Comparator.comparing((CognodataEstadoSolicitudesDTO t) -> {
            Date fecha = null;
            try {
                fecha= t.getFechaSolicitudToDate();
            } catch (ParseException e) {
                LOG.error(e.getMessage());
            }
            return fecha;
        }, Comparator.nullsLast(Comparator.naturalOrder())
        )
        .thenComparing(CognodataEstadoSolicitudesDTO::getIdSolicitud)
);