У меня есть компаратор, который сравнивает вложенные поля объекта. Здесь price
из product
.
Проблема: если поле пустое, я получаю исключение NullPointerException.
Вопрос: как я могу сказать компаратору игнорировать объекты, у которых поле сравнения равно нулю, без (!) Предварительной фильтрации списка? Под игнорированием я имею в виду, что они находятся в конце списка.
public class SorterTest {
private static final Comparator<Product> PRODUCT_COMPARATOR =
Comparator.comparing(p -> p.details.price);
static class Product {
String name;
Details details;
static class Details {
BigDecimal price;
}
}
@Test
public void test() {
List<Product> products = Arrays.asList(
createProduct("A", new BigDecimal(30.00)),
createProduct("B", new BigDecimal(55.00)),
createProduct("C", new BigDecimal(20.00)),
createProduct("D", null),
createProduct("E", null),
createProduct("F", null)
);
Collections.sort(products, PRODUCT_COMPARATOR);
assertEquals("C", products.get(0).name);
assertEquals("A", products.get(1).name);
assertEquals("B", products.get(2).name);
assertEquals("D", products.get(3).name);
assertEquals("E", products.get(4).name);
assertEquals("F", products.get(5).name);
}
private Product createProduct(String name, BigDecimal price) {
Product p = new Product();
p.details = new Product.Details();
p.name = name;
p.details.price = price;
return p;
}
}
Результат:
java.lang.NullPointerException
at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
at java.util.TimSort.binarySort(TimSort.java:296)
at java.util.TimSort.sort(TimSort.java:221)
at java.util.Arrays.sort(Arrays.java:1438)
at java.util.Arrays$ArrayList.sort(Arrays.java:3895)
at java.util.Collections.sort(Collections.java:175)