I have a Photo
object:
public class Photo {
@Id
private String id;
private LocalDateTime created;
private Integer poNumber;
}
poNumber can be null for some photos or all photos in a set. I want to sort a set of photos according to poNumber, so that the lowest poNumber appears first in the sorted set. poNumber may also be duplicated in the set. If poNumber is duplicated then sort according to created (earliest created photo appears first). If poNumber is null then sort according to created.
I tried the below code:
Set<Photo> orderedPhotos = new TreeSet<>(
Comparator.nullsFirst(Comparator.comparing(Photo::getPoNumber))
.thenComparing(Photo::getCreated));
for (Photo photo : unOrderedPhotos) {
orderedPhotos.add(photo);
}
But it throws a NullPointerException
whenever poNumber is null. If poNumber is not null then it works fine. How can I solve this issue?
We need a solution which turns the Function<>
to a Comparator, but in a way which adds the said null
checking to the chain.
And that's where Oleksandr's answer enters the scene: it creates a Comparator
which maps the compared Photo
to comparing of Integer
s, and then adds a Comparator which naturally orders these Integer
s with the null
s first:
Comparator.comparing(Photo::getPoNumber, Comparator.nullsFirst(Comparator.naturalOrder()))
And this comparator is then chained (for the case of equality) with another comparator which considers the creation date.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With