должно быть
Comparator<IShopProduct> comparator =
Comparator.comparing( IShopProduct::getVintage,
Comparator.nullLast(naturalOrder()));
Comparator.nullFirst()/nullLast()
считают нулевое значение большим / меньшим, чем ненулевой объект
Редактировать
Это реализация Comparator.comparing ():
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
Как вы видите, он вызывает keyExtractor.apply(c1).compareTo()
, поэтому он бросит NPE, если keyExtractor.apply(c1)
равно null
Мой предложенный код с использованием следующей функции:
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}
Как правило, он извлекает значение, а затем передает сравниваемые значения в Comparator
.
Значения будут переданы в компаратор naturalOrder()
с разрешением в value1.compareTo(value2)
. Обычно он генерирует NPE, но мы обернули его Comparator.nullLast
, у которого есть специальный обработчик null
.