java - 如何处理 Java 8 比较器中的空值和重复值?
问题描述
我有一个Photo
对象:
public class Photo {
@Id
private String id;
private LocalDateTime created;
private Integer poNumber;
}
poNumber 对于某些照片或一组照片可以为空。我想根据 poNumber 对一组照片进行排序,使最低 poNumber 出现在排序后的集合中。poNumber 也可能在集合中重复。如果 poNumber 重复,则根据创建的排序(最早创建的照片首先出现)。如果 poNumber 为空,则根据创建的排序。
我尝试了以下代码:
Set<Photo> orderedPhotos = new TreeSet<>(
Comparator.nullsFirst(Comparator.comparing(Photo::getPoNumber))
.thenComparing(Photo::getCreated));
for (Photo photo : unOrderedPhotos) {
orderedPhotos.add(photo);
}
但NullPointerException
只要 poNumber 为空,它就会抛出一个。如果 poNumber 不为空,那么它工作正常。我该如何解决这个问题?
解决方案
我们需要一个解决方案,将其Function<>
转换为比较器,但以某种方式将所述null
检查添加到链中。
这就是Oleksandr 的回答进入场景的地方:它创建了一个将比较Comparator
映射Photo
到比较Integer
s 的 a,然后添加一个 Comparator,它自然地先将这些Integer
s 与null
s 排序:
Comparator.comparing(Photo::getPoNumber, Comparator.nullsFirst(Comparator.naturalOrder()))
然后这个比较器与另一个考虑创建日期的比较器链接(对于相等的情况)。
推荐阅读
- css - Bootstrap 4.1.3 $font-family-base 被忽略
- java - 将多个微服务相互依赖部署到 docker 容器中
- c# - webhost respawn上的asp.net核心自托管应用程序泄漏
- mysql - Node Express MySql Sql 查询不起作用
- javascript - Object.getOwnPropertyDescriptors 不是函数
- ruby-on-rails - 如何在 Rails 模型中添加外键关联?
- c++ - MATLAB 由于 calllib(C++ .h 文件和 FORTRAN .dll)而崩溃
- javascript - 从 express-handlebars 获取数据到我的 javascript 文件
- docker - 如何减少构建上下文
- reactjs - 我如何在 reactJS 上制作 lib 文件