Java中逻辑运算符&&、||、!是条件组合过滤最直接方式,用于if、while、filter()等场景,支持短路求值以避免空指针,推荐将安全检查置左并提取语义化方法提升可读性。

Java 中逻辑运算符(&&、||、!)是实现条件组合过滤最直接、最常用的方式,核心在于用布尔表达式描述多个筛选条件之间的关系,并在 if、while、filter() 等上下文中组合使用。
用 && 和 || 组合多个判断条件
实际业务中,过滤往往不是单条件,而是“同时满足”或“满足其一”。比如:筛选年龄在 18–60 岁之间且状态为“启用”的用户。
- &&(逻辑与):左右两边都为 true,整体才为 true;支持短路——左边为 false 时,右边不再执行
- ||(逻辑或):左右任一边为 true,整体即为 true;也短路——左边为 true 时,右边跳过
示例:
User u = ...;
if (u != null && u.getAge() >= 18 && u.getAge() <= 60 && "ACTIVE".equals(u.getStatus())) {
// 符合条件,加入结果集
}
用 ! 配合括号反转复合条件
有时需要“排除不符合某组规则”的数据,比逐个写正向条件更清晰。注意:单独对一个条件取反容易理解,但对组合条件取反时,必须加括号,否则优先级易出错(! 优先级高于 && 和 ||)。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 错误写法:
!a && b等价于(!a) && b,不是!(a && b) - 正确写法:
!(a && b || c)明确表示“不满足(a 且 b)或 c”
例如:过滤掉“已删除”或“试用期未过”的用户:
if (!(user.isDeleted() || user.getTrialDaysLeft() > 0)) {
// 保留:既没删除,又已过试用期
}
在 Stream.filter() 中自然表达组合逻辑
Java 8+ 的 Stream API 让条件过滤更声明式。filter() 接收 Predicate
- 每个条件尽量提取为有语义的方法(如
isAdult()、isNotExpired()),提升可读性和复用性 - 避免一行写太长的表达式;必要时用变量暂存中间结果
示例:
List<User> activeAdults = users.stream()
.filter(u -> u != null)
.filter(User::isAdult)
.filter(u -> "ACTIVE".equals(u.getStatus()))
.filter(User::isNotExpired)
.collect(Collectors.toList());
注意空指针与计算顺序(短路很重要)
组合条件中,对象可能为 null,若不控制顺序,会抛 NullPointerException。利用 && / || 的短路特性,把“安全检查”放在左边:
- ✅ 正确:
user != null && user.isActive()—— 先判空,再调方法 - ❌ 危险:
user.isActive() && user != null—— 若 user 为 null,先执行就报错 - 同理,数值比较前确保非 null:
obj != null && obj.getValue() > 0
对于复杂条件,也可用 Optional 或 Objects.nonNull() 辅助,但基础逻辑运算符仍是底层支撑。

















