// 深层嵌套的代码(不推荐) public double calculateBonus(Employee employee) { if (employee != null) { if (employee.isActive()) { if (employee.getPerformanceRating() >= 4) { if (employee.getYearsOfService() > 5) { return employee.getSalary() * 0.15; } else { return employee.getSalary() * 0.1; } } else { return0.0; } } else { return0.0; } } else { return0.0; } }优化:通过提前处理否定条件并返回,将嵌套结构扁平化。
// 提前返回(推荐) public double calculateBonus(Employee employee) { if (employee == null) return0.0; if (!employee.isActive()) return0.0; if (employee.getPerformanceRating() < 4) return0.0; // 堆代码 duidaima.com // 核心逻辑简化为单层条件 return employee.getYearsOfService() > 5 ? employee.getSalary() * 0.15 : employee.getSalary() * 0.1; }2.降低认知负担,聚焦核心逻辑
.提前返回将"特殊情况"的处理前置,使后续代码专注于核心业务逻辑。
.代码变更时,线性结构比嵌套结构更易修改,降低引入错误的风险。
// 提前返回:每个条件处理一个拒绝场景 public void accessResource(User user) { if (user == null) throw new IllegalArgumentException("用户未登录"); if (!user.isVerified()) throw new SecurityException("账号未认证"); if (!user.hasPermission("resource_access")) throw new AccessDeniedException("权限不足"); // 仅当所有校验通过后执行核心逻辑 loadResourceForUser(user); }5.避免逻辑遗漏,提高健壮性
.提前返回强制要求开发者显式处理每个否定条件,减少潜在漏洞。
// 使用提前返回快速筛选无效请求 public void processOrder(Order order) { if (order == null) return; if (order.isCancelled()) return; // 根据订单状态选择策略(避免 if-else) OrderProcessor processor = OrderProcessorFactory.getProcessor(order.getStatus()); processor.process(order); }7.性能优化(次要)
虽然现代编译器会优化代码路径,但提前返回可减少不必要的条件判断和变量初始化,在高并发场景下可能带来轻微性能提升。
2.复杂业务流程:如工作流引擎、状态机等场景,可能更适合使用状态模式或责任链模式。
3.边界条件处理
import java.util.HashMap; import java.util.Map; import java.util.function.Function; public class Restaurant { private static final Map<String, Function<Integer, Double>> PRICE_CALCULATORS = new HashMap<>(); static { // 使用 Java 8 的 put 方法初始化 Map PRICE_CALCULATORS.put("麻辣香锅", quantity -> { double basePrice = 58.0; return quantity > 3 ? basePrice * 0.9 : basePrice; }); PRICE_CALCULATORS.put("宫保鸡丁", quantity -> { double basePrice = 38.0; return quantity > 2 ? basePrice * 0.95 : basePrice; }); // 其他菜品价格计算器... } public double calculatePrice(String dishName, int quantity) { // 使用 getOrDefault 处理默认值 Function<Integer, Double> calculator = PRICE_CALCULATORS.getOrDefault( dishName, q -> 18.0// 默认价格函数 ); return calculator.apply(quantity) * quantity; } }案例2:游戏角色系统 - 使用 Java 8 接口默认方法
import java.util.HashMap; import java.util.Map; // 技能接口(Java 8 支持默认方法) interface Skill { void cast(); // 默认实现:未知技能 default void unknownSkill() { System.out.println("未知技能"); } } // 角色类型枚举 enum RoleType { WARRIOR(createWarriorSkills()), MAGE(createMageSkills()), ASSASSIN(createAssassinSkills()); private final Map<String, Skill> skills; RoleType(Map<String, Skill> skills) { this.skills = skills; } public void useSkill(String skillName) { // 使用 Java 8 的 getOrDefault 方法 skills.getOrDefault(skillName, Skill.super::unknownSkill).cast(); } // 静态工厂方法创建技能映射 private static Map<String, Skill> createWarriorSkills() { Map<String, Skill> map = new HashMap<>(); map.put("冲锋", () -> System.out.println("战士使用冲锋,对前方敌人造成伤害!")); map.put("防御", () -> System.out.println("战士开启防御姿态,减免50%伤害!")); return map; } // 其他角色技能工厂方法... }案例3:交通出行系统 - 使用 Java 8 Function 接口
import java.util.HashMap; import java.util.Map; import java.util.function.Function; public class TravelPlanner { private static final Map<String, Function<Double, Double>> TIME_CALCULATORS = new HashMap<>(); static { // 公交时间计算:25km/h,超过10km增加20%时间 TIME_CALCULATORS.put("公交", distance -> { double baseTime = distance / 25; return distance > 10 ? baseTime * 1.2 : baseTime; }); // 地铁时间计算:40km/h,超过15km增加10%时间 TIME_CALCULATORS.put("地铁", distance -> { double baseTime = distance / 40; return distance > 15 ? baseTime * 1.1 : baseTime; }); // 其他交通方式... } public double calculateTravelTime(String transport, double distance) { // 使用 getOrDefault 处理未知交通方式 Function<Double, Double> calculator = TIME_CALCULATORS.getOrDefault( transport, d -> d / 5// 默认步行速度 ); return calculator.apply(distance); } }案例4:智能家居系统 - 使用 Java 8 接口默认方法
// 设备接口(Java 8 支持默认方法) interface SmartDevice { void executeCommand(String command); // 默认方法:处理未知命令 default void handleUnknownCommand(String command) { System.out.println("未知命令:" + command); } } // 电灯实现 class Light implements SmartDevice { private boolean isOn; private int brightness; @Override public void executeCommand(String command) { switch (command) { case"开启": turnOn(); if (brightness < 30) setBrightness(70); break; case"关闭": turnOff(); break; case"调暗": setBrightness(Math.max(0, brightness - 20)); break; default: handleUnknownCommand(command); } } // 具体方法实现... }案例5:社交平台 - 使用 Java 8 Predicate 接口
import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; // 用户类 class User { private int level; private boolean verified; private boolean active; private int followers; // getters and setters... } // 权限校验接口 interface PermissionChecker { boolean check(User user); } // 社交平台类 public class SocialPlatform { private static final Map<String, PermissionChecker> PERMISSION_MAP = new HashMap<>(); private static final Map<String, ActionHandler> ACTION_HANDLER_MAP = new HashMap<>(); static { // 使用 Java 8 Predicate 接口定义权限规则 PERMISSION_MAP.put("发布文章", user -> user.getLevel() >= 3 && user.isVerified()); PERMISSION_MAP.put("评论", user -> user.getLevel() >= 1); PERMISSION_MAP.put("点赞", User::isActive); PERMISSION_MAP.put("私信", user -> user.getLevel() >= 5 && user.getFollowers() >= 10); // 注册动作处理器 ACTION_HANDLER_MAP.put("发布文章", SocialPlatform::createArticle); ACTION_HANDLER_MAP.put("评论", SocialPlatform::createComment); // 其他动作处理器... } public void processUserAction(User user, String action) { if (user == null) { System.out.println("请先登录!"); return; } // 使用 Java 8 的 Map 方法 PermissionChecker checker = PERMISSION_MAP.get(action); if (checker != null && !checker.check(user)) { System.out.println("权限不足,无法执行操作!"); return; } ActionHandler handler = ACTION_HANDLER_MAP.get(action); if (handler != null) { handler.handle(user); } else { System.out.println("未知操作:" + action); } } // 静态方法:处理用户动作 private static void createArticle(User user) { System.out.println(user + " 发布了一篇文章"); } // 其他动作处理方法... } // 动作处理器函数式接口 @FunctionalInterface interface ActionHandler { void handle(User user); }