如何简化这段嵌套if语句?能否消除重复的!P判断条件?
优化重复条件的简洁写法
当然可以简化!我们先拆解原代码里的逻辑重复点,再通过逻辑表达式的等价转换来消除重复的!P(也就是!response.payload().isPresent())。
原逻辑分析
原代码的核心逻辑是:
- 如果状态不是OK 或者 没有payload,进入分支
- 在这个分支里,只有当状态不是NOT_FOUND 或者 没有payload时,才打印错误日志
- 无论是否打印日志,最终都返回空列表
把这两个嵌套条件合并起来看,需要打印日志的场景是:(S != 200 || !P) && (S != 404 || !P)。我们可以用逻辑运算的等价转换来化简这个表达式:
根据逻辑分配律:(A || C) && (B || C) = (A && B) || C,这里:
- A = S != 200
- B = S != 404
- C = !P
化简后得到:(S !=200 && S !=404) || !P,或者换一种更直观的否定形式:!(S ==404 && P)(因为S !=404 || !P等价于!(S==404 && P))。
优化后的代码写法
基于这个化简结果,我们可以写出完全消除重复!P的代码,同时提升可读性:
private List<Foo> parseResponse(Response<ByteString> response) { Status status = response.status(); int statusCode = status.code(); boolean hasPayload = response.payload().isPresent(); if (statusCode != Status.OK.code() || !hasPayload) { // 仅当「状态是NOT_FOUND且有payload」时不打印日志,其余情况都打印 if (!(statusCode == Status.NOT_FOUND.code() && hasPayload)) { LOG.error("Cannot fetch recently played, got status code {}", status); } return Lists.newArrayList(); } // ... doSomeLogic(); return someOtherList; }
为什么之前的写法有重复?
原代码的嵌套条件其实是把「非OK状态」和「无payload」两个失败场景混在一起判断了。通过提取变量(statusCode、hasPayload)和逻辑化简,我们把重复的条件合并,既消除了代码冗余,也让逻辑更清晰——一眼就能看出:只有当状态是NOT_FOUND且存在有效payload时,我们才跳过日志打印,其他所有失败场景都需要记录错误。
内容的提问来源于stack exchange,提问作者Andrew Cheong
相关产品推荐
相关产品推荐

