基于Map<WorklistColumn, Direction>构建Sort对象的实现问题
解决Map构建Sort对象的冗余初始值问题
直接利用Map的第一个元素初始化Sort,再添加剩余元素,就能去掉那个无意义的初始值。同时要处理Map为空的情况,避免报错:
优化后的buildSort方法
private Sort buildSort(Map<WorklistColumn, Direction> columnsDirectionsMap) { // 空Map直接返回空Sort(如果Sort类允许,建议加empty静态方法) if (columnsDirectionsMap.isEmpty()) { return Sort.empty(); // 后续会说明如何添加这个方法 } Iterator<Map.Entry<WorklistColumn, Direction>> entryIterator = columnsDirectionsMap.entrySet().iterator(); // 拿第一个元素创建初始Sort实例 Map.Entry<WorklistColumn, Direction> firstEntry = entryIterator.next(); Sort sort = Sort.by(firstEntry.getKey().toString(), firstEntry.getValue()); // 迭代添加剩下的所有元素 while (entryIterator.hasNext()) { Map.Entry<WorklistColumn, Direction> entry = entryIterator.next(); sort.and(entry.getKey().toString(), entry.getValue()); } return sort; }
给Sort类加空实例方法(推荐)
因为Sort的构造方法是私有的,外部无法直接创建空实例,所以给Sort新增一个静态方法返回空Sort:
public class Sort { private List<Column> columns = new ArrayList(); private Sort() {} // 新增空实例方法 public static Sort empty() { return new Sort(); } // ... 原有by()、and()方法保持不变 ... }
备选写法(Java 8+ Stream风格)
如果习惯用Stream,也可以把Map转成List后处理:
private Sort buildSort(Map<WorklistColumn, Direction> columnsDirectionsMap) { if (columnsDirectionsMap.isEmpty()) { return Sort.empty(); } List<Map.Entry<WorklistColumn, Direction>> entryList = new ArrayList<>(columnsDirectionsMap.entrySet()); // 第一个元素初始化Sort Sort sort = Sort.by(entryList.get(0).getKey().toString(), entryList.get(0).getValue()); // 从第二个元素开始批量添加 entryList.subList(1, entryList.size()).forEach(entry -> sort.and(entry.getKey().toString(), entry.getValue()) ); return sort; }
核心思路
- 抛弃无意义的初始占位值,直接用Map内的第一个元素调用
by()创建Sort实例 - 必须处理空Map的边界情况,防止迭代时抛出
NoSuchElementException - 新增
empty()方法是最优雅的空排序实现,避免用空字符串或其他占位符凑数
内容的提问来源于stack exchange,提问作者pawello12
相关产品推荐
相关产品推荐

