Принимая более функциональный подход - PullRequest
0 голосов
/ 27 февраля 2019

У меня в настоящее время есть этот метод (это в основном реальный, я просто переименовал переменные и объекты)

private void myMethod(
      final InputMessage inputMessage,
      final String id) {
    try {
        final Map<String, String> result =
              jdbcTemplate.query(
                  QUERY /* sql */, 
                  ROW_EXTRACTOR /* ResultSetExtractor */, 
                  id /* args */
              );

        if (result != null) {
            inputMessage.setParam1(result.get("param1"));
            inputMessage.setId(result.get("description")); // Insert description
            return;
        }
    } catch (final Exception e) {
        logger.error(...);
    }

    final String param1 = ...

    inputMessage.setParam1(param1);
    inputMessage.setId(id); // Insert the ID
}

Я бы хотел использовать более функциональный подход для этого.Просто чтобы попробовать.
Я думал о разных решениях, но ни одно из них не может поддерживать ту же логику.

Как бы вы это сделали?Возможно ли это вообще?
Я на Java 8, но вы можете добавить Java 11 классы и методы, если необходимо.

Нет необходимости "конвертировать" весь метод,Меня больше интересует часть после извлечения result.Однако он тесно связан с блоком try - catch.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

При запросе результатов базы данных вы должны использовать дополнительный класс в Java, чтобы избежать исключений NullPointerExceptions.(https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html здесь приведена дополнительная документация).

Например, следующий фрагмент кода:

final Map<String, String> result =
          jdbcTemplate.query(
              QUERY /* sql */, 
              ROW_EXTRACTOR /* ResultSetExtractor */, 
              id /* args */
          );

Не должен возвращать ноль, а скорее Optional<Map<String,String>>,тогда вы сможете написать код функциональным образом, подобным следующему:

result.ifPresent(res -> {
            inputMessage.setParam1(res.get("param1"));
            inputMessage.setId(res.get("description")); // Insert description
        });

Это также поможет вам вывести оператор try-catch, который здесь не нужен.

Также рекомендуется разделять функции выборки данных на уровне DAO и выполнять операции с выбранными объектами на уровне Service.Пожалуйста, найдите больше документации относительно этого здесь: https://www.baeldung.com/java-dao-pattern

0 голосов
/ 27 февраля 2019

Я бы предпочел вернуть новый InputMessage из метода, а не передавать его в качестве параметра.Предполагая, что у вас есть конструктор для InputMessage с 2 параметрами, он будет выглядеть так:

return Optional.ofNullable(result)
    .map(map -> new InputMessage(map.get("param1"), map.get("description")))
    .orElse(new InputMessage("id", "param1"));
0 голосов
/ 27 февраля 2019

А как же:

private void myMethod(final InputMessage inputMessage, final String id) { 
    final Map<String, String> result = null;
    try {
        result = jdbcTemplate.query(
             QUERY /* sql */, 
             ROW_EXTRACTOR /* ResultSetExtractor */, 
             id /* args */
        );
    } catch (final Exception e) {
        logger.error(...);
    }

    if (result != null)
        setParams(inputMessage, result.get("param1"), result.get("description")) 
    else
        setParams(inputMessage, param1, id);
}

public void setParams(final InputMessage inputMessage, String param1, String param2) {
    inputMessage.setParam1(param1);
    inputMessage.setId(param2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...