1. Обзор
В этой быстрой статье мы будем использовать Java 8 Stream API и класс Introspector
для вызова всех геттеров, найденных в POJO.
Мы создадим поток геттеров, проверим возвращаемые значения и посмотрим, является ли значение поля нулевым.
2. Настройка
Единственная настройка, которая нам нужна, — это создать простой класс POJO:
public class Customer {
private Integer id;
private String name;
private String emailId;
private Long phoneNumber;
// standard getters and setters
}
3. Вызов методов получения
Мы проанализируем класс Customer с помощью
Introspector
; это обеспечивает простой способ обнаружения свойств, событий и методов, поддерживаемых целевым классом.
Сначала мы соберем все экземпляры PropertyDescriptor
нашего класса Customer .
PropertyDescriptor
фиксирует всю информацию о свойстве Java Bean:
PropertyDescriptor[] propDescArr = Introspector
.getBeanInfo(Customer.class, Object.class)
.getPropertyDescriptors();
Давайте теперь пройдемся по всем экземплярам PropertyDescriptor
и вызовем метод чтения для каждого свойства:
return Arrays.stream(propDescArr)
.filter(nulls(customer))
.map(PropertyDescriptor::getName)
.collect(Collectors.toList());
Используемый выше предикат nulls
проверяет, может ли свойство быть прочитано, вызывает геттер и фильтрует только нулевые значения:
private static Predicate<PropertyDescriptor> nulls(Customer customer) {
return = pd -> {
Method getterMethod = pd.getReadMethod();
boolean result = false;
return (getterMethod != null && getterMethod.invoke(customer) == null);
};
}
Наконец, давайте теперь создадим экземпляр Customer
, установим для нескольких свойств значение null и протестируем нашу реализацию:
@Test
public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() {
Customer customer = new Customer(1, "John", null, null);
List<String> result = Utils.getNullPropertiesList(customer);
List<String> expectedFieldNames = Arrays
.asList("emailId","phoneNumber");
assertTrue(result.size() == expectedFieldNames.size());
assertTrue(result.containsAll(expectedFieldNames));
}
4. Вывод
В этом кратком руководстве мы хорошо использовали API Java 8 Stream и экземпляр Introspector
— для вызова всех геттеров и получения списка нулевых свойств .
Как обычно, код доступен на GitHub .