在Java业务开发中,经常会出现根据前端传入的不同参数,执行不同查询排序逻辑的场景,传统写法会嵌套大量if-else语句,随着条件增多代码会变得难以维护。我们可以通过Map和自定义对象来优化这类逻辑,让代码结构更清晰。

传统多层if-else的问题
假设我们有一个用户查询接口,前端可以传入排序类型参数,比如按年龄升序、按注册时间降序、按积分升序等,传统写法如下:
public List<User> queryUsers(String sortType) {
List<User> userList = getUserListFromDB();
if ("age_asc".equals(sortType)) {
userList.sort(Comparator.comparing(User::getAge));
} else if ("age_desc".equals(sortType)) {
userList.sort(Comparator.comparing(User::getAge).reversed());
} else if ("register_time_asc".equals(sortType)) {
userList.sort(Comparator.comparing(User::getRegisterTime));
} else if ("register_time_desc".equals(sortType)) {
userList.sort(Comparator.comparing(User::getRegisterTime).reversed());
} else if ("score_asc".equals(sortType)) {
userList.sort(Comparator.comparing(User::getScore));
} else {
// 默认按注册时间降序
userList.sort(Comparator.comparing(User::getRegisterTime).reversed());
}
return userList;
}
这种写法的问题很明显,每增加一种排序类型就要新增一个else if分支,代码层级越来越深,修改时很容易影响原有逻辑,维护成本很高。
自定义对象封装排序逻辑
首先我们可以定义一个排序规则自定义对象,用来封装排序的字段和排序方向:
import java.util.Comparator;
/**
* 自定义排序规则对象
*/
public class SortRule {
// 排序字段对应的比较器
private Comparator<?> comparator;
// 是否降序
private boolean isDesc;
public SortRule(Comparator<?> comparator, boolean isDesc) {
this.comparator = comparator;
this.isDesc = isDesc;
}
/**
* 获取完整的排序比较器
*/
public Comparator<Object> getFullComparator() {
if (isDesc) {
return (Comparator<Object>) ((Comparator)comparator).reversed();
}
return (Comparator<Object>) comparator;
}
}
用Map存储条件与规则的映射
接下来我们创建一个Map,key是前端传入的排序类型字符串,value是对应的SortRule对象,把所有排序规则提前初始化到Map中:
import java.util.HashMap;
import java.util.Map;
public class UserQueryService {
// 排序规则映射Map
private static final Map<String, SortRule> SORT_RULE_MAP = new HashMap<>();
static {
// 初始化所有排序规则
SORT_RULE_MAP.put("age_asc", new SortRule(Comparator.comparing(User::getAge), false));
SORT_RULE_MAP.put("age_desc", new SortRule(Comparator.comparing(User::getAge), true));
SORT_RULE_MAP.put("register_time_asc", new SortRule(Comparator.comparing(User::getRegisterTime), false));
SORT_RULE_MAP.put("register_time_desc", new SortRule(Comparator.comparing(User::getRegisterTime), true));
SORT_RULE_MAP.put("score_asc", new SortRule(Comparator.comparing(User::getScore), false));
}
// 默认排序规则
private static final SortRule DEFAULT_SORT_RULE = new SortRule(Comparator.comparing(User::getRegisterTime), true);
// 模拟从数据库获取用户列表
private List<User> getUserListFromDB() {
// 实际业务中这里是数据库查询逻辑
return new ArrayList<>();
}
}
优化后的查询排序逻辑
最后我们修改查询方法,直接从Map中获取对应的排序规则,不需要再写多层if-else:
public List<User> queryUsers(String sortType) {
List<User> userList = getUserListFromDB();
// 从Map中获取排序规则,没有则使用默认规则
SortRule sortRule = SORT_RULE_MAP.getOrDefault(sortType, DEFAULT_SORT_RULE);
// 执行排序
userList.sort((Comparator<User>) sortRule.getFullComparator());
return userList;
}
优化方案的优势
- 代码更简洁:消除了多层嵌套的if-else,逻辑层级更扁平,可读性大幅提升。
- 扩展性强:后续新增排序类型时,只需要在SORT_RULE_MAP中添加新的映射即可,不需要修改原有查询方法的逻辑,符合开闭原则。
- 维护成本低:所有排序规则集中在Map中管理,修改某条规则时只需要调整对应的SortRule对象,不会影响其他逻辑。
注意事项
如果排序规则比较复杂,比如需要多字段组合排序,可以在SortRule中扩展多字段比较器的逻辑,或者在初始化Map时直接传入组合好的比较器。另外如果条件判断不仅涉及排序,还有其他业务逻辑,也可以把对应的处理逻辑封装成函数式接口,存入Map中执行,适配更多场景。