如何简化Optional<List<Account>>处理逻辑?减少If-Else使用
利用Optional链式调用简化逻辑,摆脱冗余If-Else
嘿,刚接触Optional确实容易摸不清门道,但你的需求刚好能完美利用它的链式调用特性,彻底去掉那些繁琐的If-Else判断!我给你整理了两种优化方案,一步步帮你理清楚:
方案一:保留过滤后的账户列表(如果需要后续使用)
如果之后还要用到符合条件的账户数据,可以用这种写法:
// 先定义符合条件的账户类型,方便后续维护 private static final Set<String> ELIGIBLE_ACCOUNT_TYPES = Set.of("typeA", "typeB"); // 核心逻辑 String result = myRepo.findAcctByCustoNo(auth.getCustNo()) // 将原账户列表转换为过滤后的列表(仅当原列表存在时执行) .map(accountList -> accountList.stream() .filter(account -> ELIGIBLE_ACCOUNT_TYPES.contains(account.getAccCd())) .collect(Collectors.toList())) // 过滤掉空的结果列表,让Optional变为empty() .filter(filteredList -> !filteredList.isEmpty()) // 有符合条件的账户时,返回通过信息 .map(filteredList -> "Eligible for new product") // 处理两种空场景:原列表不存在/过滤后无数据 .orElseGet(() -> myRepo.findAcctByCustoNo(auth.getCustNo()).isPresent() ? "No Data" : "invalid param"); return result;
方案二:仅判断资格(无需保留过滤列表,性能更优)
如果只是要判断客户是否有资格,不需要保留过滤后的账户,用anyMatch更高效:
private static final Set<String> ELIGIBLE_ACCOUNT_TYPES = Set.of("typeA", "typeB"); String result = myRepo.findAcctByCustoNo(auth.getCustNo()) // 直接判断是否存在符合条件的账户 .map(accountList -> accountList.stream() .anyMatch(account -> ELIGIBLE_ACCOUNT_TYPES.contains(account.getAccCd()))) // 根据判断结果返回对应信息 .map(isEligible -> isEligible ? "Eligible for new product" : "No Data") // 原列表不存在时返回参数无效 .orElse("invalid param"); return result;
关键逻辑解释:
map():Optional的map方法只会在内部有值的时候执行转换,空的话直接跳过,完美替代了if(accounts.isPresent())的判断。filter():用来过滤转换后的结果(比如过滤空列表),如果不符合条件,Optional会变成空,自动进入后续的orElse分支。orElseGet()/orElse():统一处理所有空场景,避免了多个If-Else分支。
这样写出来的代码完全是链式调用,没有任何显式的If-Else,既简洁又符合Java函数式编程的风格,也能清晰覆盖所有业务场景:
- 数据库查不到账户 → 返回
invalid param - 查到账户但没有符合类型的 → 返回
No Data - 有符合类型的账户 → 返回资格通过的信息
内容的提问来源于stack exchange,提问作者chronos14
相关产品推荐
相关产品推荐

