Android中如何避免嵌套IF条件实现更简洁的代码?
优化多重else if条件的简洁实现方案
原代码的问题在于大量重复的条件判断,每个分支都要校验所有参数的状态,不仅冗余,后续新增设置项时还容易漏改条件。下面提供两种更简洁的实现方式,核心思路是把参数与对应执行动作绑定,通过遍历或流式处理替代嵌套判断。
方式一:用列表封装参数与动作(Java 8+适用)
先把每个设置项的参数获取逻辑和对应执行方法封装成条目,再通过流式处理判断并执行:
import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; // 封装参数提供者和对应的执行动作 List<Map.Entry<Supplier<Integer>, Consumer<Integer>>> settingEntries = Arrays.asList( new AbstractMap.SimpleEntry<>(() -> advance_value_power_save_after, pesManager::advanceSettingsPowerSaveAfterCommand), new AbstractMap.SimpleEntry<>(() -> advance_value_power_off, pesManager::advanceSettingsPowerOffCommand), new AbstractMap.SimpleEntry<>(() -> advance_value_grid, pesManager::advanceSettingsGridCommand), new AbstractMap.SimpleEntry<>(() -> advance_value_aux, pesManager::advanceSettingsAuxCommand), new AbstractMap.SimpleEntry<>(() -> advance_dim_dispaly, pesManager::advanceSettingsDimDisplay), new AbstractMap.SimpleEntry<>(() -> advance_fast_charge, pesManager::advanceSettingsFastChargeMode) ); // 统计非零参数的数量 long nonZeroCount = settingEntries.stream() .map(Map.Entry::getKey) .map(Supplier::get) .filter(v -> v != 0) .count(); if (nonZeroCount == 1) { // 找到唯一非零参数并执行对应动作 settingEntries.stream() .filter(entry -> entry.getKey().get() != 0) .findFirst() .ifPresent(entry -> entry.getValue().accept(entry.getKey().get())); } else { // 原else分支的业务逻辑 }
方式二:用枚举类统一管理设置项(Java 16+推荐)
用枚举类把每个设置项的参数和动作绑定,代码可读性和扩展性更强:
import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; enum SettingType { POWER_SAVE_AFTER(() -> advance_value_power_save_after, pesManager::advanceSettingsPowerSaveAfterCommand), POWER_OFF(() -> advance_value_power_off, pesManager::advanceSettingsPowerOffCommand), GRID(() -> advance_value_grid, pesManager::advanceSettingsGridCommand), AUX(() -> advance_value_aux, pesManager::advanceSettingsAuxCommand), DIM_DISPLAY(() -> advance_dim_dispaly, pesManager::advanceSettingsDimDisplay), FAST_CHARGE(() -> advance_fast_charge, pesManager::advanceSettingsFastChargeMode); private final Supplier<Integer> valueSupplier; private final Consumer<Integer> action; SettingType(Supplier<Integer> valueSupplier, Consumer<Integer> action) { this.valueSupplier = valueSupplier; this.action = action; } public int getValue() { return valueSupplier.get(); } public void execute() { action.accept(getValue()); } } // 业务逻辑处理 long nonZeroCount = Arrays.stream(SettingType.values()) .filter(type -> type.getValue() != 0) .count(); if (nonZeroCount == 1) { Arrays.stream(SettingType.values()) .filter(type -> type.getValue() != 0) .findFirst() .ifPresent(SettingType::execute); } else { // 原else分支的业务逻辑 }
优化优势
- 减少冗余:无需重复编写所有参数的等于0判断;
- 扩展性强:新增设置项时,只需在列表/枚举中添加一行即可,无需修改条件分支;
- 可读性高:参数与动作的对应关系一目了然,便于维护。
内容的提问来源于stack exchange,提问作者jyohya
相关产品推荐
相关产品推荐

