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

1

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

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?

  • 0
    как насчет вашего дизайна? Может быть, имеет смысл добавить такой метод в класс Employee.
  • 0
    Не могу изменить сущность jpa "Employee", она находится в библиотеке
Теги:
map

6 ответов

8
Лучший ответ

Один из способов - реорганизовать блок 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());
}
  • 2
    черт побери! опоздал на 13 секунд :(
  • 1
    голос за самый быстрый :)
Показать ещё 1 комментарий
1

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

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());
1

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

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);
}

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

1
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());


}
0

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

ObjectMapper mapper = new ObjectMapper();
Map<String,String> map = mapper.convert(mapper.writeValueAsString(<yourObject),new TypeReference<HashMap<String,String>>(){});
  • 0
    Не хочу вводить другую зависимость.
0

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

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());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню