如何将指定Java方法转为函数式实现?需保留原有业务逻辑
嘿,我来帮你梳理下怎么用更函数式的风格重构这段代码,同时100%保留原有逻辑~先来看下你的原代码(我帮你格式化了下):
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 = ...; // 原逻辑中的默认param1获取逻辑 inputMessage.setParam1(param1); inputMessage.setId(id); // Insert the ID }
原有逻辑拆解
先明确核心逻辑,确保重构不丢功能:
- 优先尝试用
id查询数据库,得到结果Map - 若查询结果非空,用结果里的
param1和description设置inputMessage,直接返回 - 若查询抛出异常 或 结果为空,则用默认逻辑生成
param1,并把传入的id设置到inputMessage
函数式重构方案
核心思路是把「查询+异常捕获+空值处理」封装成单独的函数,返回Optional<Map<String, String>>,然后用Optional的链式API来处理业务逻辑,解耦异常捕获和业务设置的代码。
第一步:封装查询逻辑
把try-catch包裹的查询逻辑抽成单独方法,用Optional处理空值:
private Optional<Map<String, String>> fetchDbResult(String id) { try { Map<String, String> result = jdbcTemplate.query(QUERY, ROW_EXTRACTOR, id); return Optional.ofNullable(result); // 把null转为Optional.empty() } catch (Exception e) { logger.error(...); // 保留原异常日志逻辑 return Optional.empty(); } }
第二步:重构主方法
根据你使用的Java版本,有两种简洁写法:
如果你用Java 11(推荐)
利用Java 9引入的Optional.ifPresentOrElse()方法,直接处理「有结果」和「无结果/异常」两种分支,完全对应原逻辑:
private void myMethod(final InputMessage inputMessage, final String id) { fetchDbResult(id) .ifPresentOrElse( // 分支1:查询到非空结果,对应原代码的return分支 result -> { inputMessage.setParam1(result.get("param1")); inputMessage.setId(result.get("description")); }, // 分支2:查询为空或抛出异常,对应原代码的catch和else逻辑 () -> { final String param1 = ...; // 原默认逻辑 inputMessage.setParam1(param1); inputMessage.setId(id); } ); }
如果你用Java 8
Java 8没有ifPresentOrElse(),可以用isPresent()判断,逻辑同样清晰:
private void myMethod(final InputMessage inputMessage, final String id) { Optional<Map<String, String>> dbResult = fetchDbResult(id); if (dbResult.isPresent()) { Map<String, String> result = dbResult.get(); inputMessage.setParam1(result.get("param1")); inputMessage.setId(result.get("description")); } else { final String param1 = ...; // 原默认逻辑 inputMessage.setParam1(param1); inputMessage.setId(id); } }
可行性说明
这个方案完全保留了原有逻辑的所有细节:
- 异常捕获和日志输出和原代码一致
- 查询结果为空时的处理逻辑完全对应
- 函数式风格的重构把「副作用(数据库查询、日志)」和「业务设置逻辑」做了解耦,主方法的逻辑更清晰易读
- 不管是Java 8还是Java 11都能完美适配,不需要改造整个类,只需要调整这个方法的实现
内容的提问来源于stack exchange,提问作者LppEdd
相关产品推荐
相关产品推荐

