【问题标题】:Error in thenComparing is not applicable for the arguments Comparator<..DTO>thenComparing 中的错误不适用于参数 Comparator<..DTO>
【发布时间】:2021-11-03 09:15:55
【问题描述】:

所以我在 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());
            

【问题讨论】:

  • do not post error messages in images。图像不如文本,因为它们无法被屏幕阅读器搜索、复制粘贴、访问等等。
  • solicitudes 是如何定义的?在第一个比较器中需要强制转换 ((CognodataEstadoSolicitudesDTO) t) 暗示了 solicitudes 的泛型类型存在问题
  • 列出 关心@ThomasKläger
  • 顺便说一句,你为什么不直接使用thenComparing(CognodataEstadoSolicitudesDTO::getIdSolicitud)
  • 如果我这样做,我也会遇到同样的错误

标签: java comparator


【解决方案1】:

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

最好使用方法List::sort 接受比较器并使用Comparator::nullsLast 处理可能的空值

solicitudes.sort(
    Comparator.comparing(
        CognodataEstadoSolicitudesDTO::getFechaSolicitudToDate, 
        Comparator.nullsLast(Comparator.naturalOrder())
    )
    .thenComparing(CognodataEstadoSolicitudesDTO::getIdSolicitud)
);

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

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)
);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 2023-03-18
      • 1970-01-01
      • 2021-11-03
      • 2011-08-29
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多