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