采取更实用的方法

时间:2019-02-27 14:47:57

标签: java functional-programming

我目前有这种方法(基本上是真正的方法,我只是重命名了变量和对象)

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 :(得分:1)

我宁愿从方法中返回新的InputMessage而不是将其作为参数传递。假设您具有2个参数的InputMessage构造函数,它将看起来像:

return Optional.ofNullable(result)
    .map(map -> new InputMessage(map.get("param1"), map.get("description")))
    .orElse(new InputMessage("id", "param1"));

答案 1 :(得分:0)

那又怎么样:

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

答案 2 :(得分:0)

查询数据库结果时,应使用Java中的Optional类,以避免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 */
          );

不应该返回null而是返回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