德·摩根定律是将否定条件转化为更清晰业务语义的实用工具:遇!(A&&B)改写为!A||!B,遇!(A||B)改写为!A&&!B,需逐层展开嵌套并兼顾null安全与可读性。

德·摩根定律不是数学技巧,而是让条件判断回归业务语义的实用工具。它帮你把“不是A且B”这种绕口表述,转成更贴近人话的“没A或没B”,从而避开嵌套、减少歧义、提升可读性。
什么时候该用德·摩根定律
当你看到带括号的否定表达式,尤其是!()里还混着&&或||时,就是德·摩根定律该出手的时候:
-
if (!(user != null && user.isActive()))→ 否定一个“与” -
while (!(status == "OK" || status == "WARN"))→ 否定一个“或” -
if (! (hasEmail && (isAdult || hasConsent)))→ 嵌套结构,也适用
怎么一步步化简
记住两个动作:变运算符、翻子表达式。不用背公式,按步骤操作就行:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 遇到
!(A && B),改成!A || !B(“与”变“或”,每个都取反) - 遇到
!(A || B),改成!A && !B(“或”变“与”,每个都取反) - 多层嵌套时,从最外层括号开始,逐层往外展开。例如:
!(a && (b || c))→!a || !(b || c)→!a || (!b && !c)
化简后别忘了语义升级
光改写还不够,要顺势把逻辑“翻译”成业务语言:
立即学习“Java免费学习笔记(深入)”;
- 把
!user.isAuthenticated || (user.role != "admin" && user.role != "moderator")提取为boolean isUnauthorized = !user.isAuthenticated || !hasAdminOrModeratorRole(user); - 把
number 99封装成方法isNotTwoDigit(number),比!(number >= 10 && number 更直白 - Stream中避免手写
u -> !u.isActive(),改用Predicate<user>.negate()</user>或定义isInactive()静态方法
容易踩的坑要绕开
化简不是机械替换,得兼顾安全和可维护性:
- 别为了否定而否定:如果业务本意是“不满足全部条件”,保留
!(a && b && c)反而更贴切 - null 安全不能靠运气:用
Objects.nonNull(obj)替代obj != null,尤其在组合条件里 - 别写连续否定:像
!!(a || b)不仅多余,还可能掩盖a或b是 null 的问题 - Stream.filter() 中不能直接对方法引用加
!,编译会报错,必须用negate()或自定义谓词

















