Java - удалить несколько IF для нулевой проверки

64
8

Я получаю объект и карту в методе, и мне нужно перенести все значения полей объекта на карту. Что будет позже сохранено в БД. Значения карты не могут быть нулевыми.
Это код:

public static final EMP_LAST_NAME_ATTR = "firstName";
public static final EMP_FIRST_NAME_ATTR = "lastName";
...ect.

а также

public void addAttributes(Map<String, String> attributes, Employee employee) {
if (StringUtils.isNotBlank(employee.getFirstName())) {
attributes.put(EMP_FIRST_NAME_ATTR, employee.getFirstName());
}
if (StringUtils.isNotBlank(employee.getLastName())) {
attributes.put(EMP_LAST_NAME_ATTR, employee.getLastName());
}
if (StringUtils.isNotBlank(employee.getEmail())) {
attributes.put(EMP_EMAIL_ATTR, employee.getEmail());
}
...etc many more ifs
}

К сожалению, это должна быть карта, так как таблица БД создается как ключ/значение, и я не могу изменить сущности.
Любой способ сократить этот кошмар IF?

спросил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
1
Решение
134

Один из способов - реорганизовать блок if в его собственный метод:

private void putIfNotBlank(Map<String, String> attributes, String key, String value) {
if (StringUtils.isNotBlank(value)) {
attributes.put(key, values);
}
}

и ваш метод легче читать:

public void addAttributes(Map<String, String> attributes, Employee employee) {
putIfNotBlank(attributes, EMP_FIRST_NAME_ATTR, employee.getFirstName());
putIfNotBlank(attributes, EMP_LAST_NAME_ATTR, employee.getLastName());
putIfNotBlank(attributes, EMP_EMAIL_ATTR, employee.getEmail());
}

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
64

Сделайте способ сделать это за вас.

public void addAttributes(Map<String,String> attributes, Employee employee)
{
addAttribute(attributes, EMP_FIRST_NAME_ATTR, employee.getFirstName());
addAttribute(attributes, EMP_LAST_NAME_ATTR, employee.getLastName());
.....
}

private void addAttribute(Map<String,String> attributes, String ATTR_NAME, String value)
{
if(StringUtils.isNotBlank(value)) attributes.put(ATTR_NAME, value);
}

Задача решена.

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
63

private void addAttribute(Map<String, String> attributes, String key, String value) {
if (StringUtils.isNotBlank(value)) {
attributes.put(key, value);
}
}

public void addAttributes(Map<String, String> attributes, Employee employee) {
addAttribute(attributes, EMP_FIRST_NAME_ATTR, employee.getFirstName());
addAttribute(attributes, EMP_LAST_NAME_ATTR, employee.getLastName());
addAttribute(attributes, EMP_EMAIL_ATTR, employee.getEmail());

}

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
64

Сделайте некоторый рефакторинг, создав полезный метод, который фиксирует суть проверки:

public static void putIfNotBlank(Map<String, String> map, String key, String value) {
if (StringUtils.isNotBlank(value))
map.put(key, value);
}

Затем назовите его для каждого атрибута:

putIfNotBlank(attributes, EMP_EMAIL_ATTR, employee.getEmail());

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
45

Вы можете определить новую карту, в которой было построено такое поведение:

public class NonBlankValueMap extends HashMap<String, String> {
@Override
public String put(String key, String value) {
if (StringUtils.isNotBlank(value))
return super.put(key, value);
return null;
}
}

Тогда просто:

Map<String, String> attributes = new NonBlankValueMap();

А также:

attributes.put(EMP_FIRST_NAME_ATTR, employee.getFirstName());

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
45

Использовать библиотеку ObjectMapper от Jackson Json

ObjectMapper mapper = new ObjectMapper();
Map<String,String> map = mapper.convert(mapper.writeValueAsString(<yourObject),new TypeReference<HashMap<String,String>>(){});

ответил(а) 2021-01-19T12:51:42+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема