Как найти всех получателей, возвращающих ноль

Как найти всех получателей, возвращающих ноль

1. обзор

В этой быстрой статье мы будем использовать Java 8 Stream API и классIntrospector - для вызова всех геттеров, найденных в POJO.

Мы создадим поток геттеров, проверим возвращаемые значения и посмотрим, равно ли значение поляnull.

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 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 result = Utils.getNullPropertiesList(customer);
    List expectedFieldNames = Arrays
      .asList("emailId","phoneNumber");

    assertTrue(result.size() == expectedFieldNames.size());
    assertTrue(result.containsAll(expectedFieldNames));
}

4. Заключение

В этом коротком руководстве мы хорошо использовали Java 8 Stream API и экземплярIntrospector - чтобы вызвать все геттеры и получить список нулевых свойств.

Как обычно, доступен кодover on GitHub.