You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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函数式编程的风格,也能清晰覆盖所有业务场景:

  1. 数据库查不到账户 → 返回invalid param
  2. 查到账户但没有符合类型的 → 返回No Data
  3. 有符合类型的账户 → 返回资格通过的信息

内容的提问来源于stack exchange,提问作者chronos14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:11:07