在不使用資料庫的情況下,對 List<Map<String, Object>> 提供類 SQL 的多條件查詢能力,支援精確、範圍、模糊三種模式。
FilterNormal:精確比對(contains)FilterBetween:範圍查詢(以 Φ 分隔上下界)FilterFuzzy:模糊查詢(跨欄位字串搜尋)// 多層 Map:POLICY -> (field -> value)
public class HashHashMap<K1, K2, V> { /* 略 */ }
public enum POLICY { NORMAL, BETWEEN, FUZZY }
// 抽象過濾器
abstract class Filter {
Filter next;
public void setNext(Filter n) { next = n; }
abstract boolean doFilter(Map<String, Object> row, POLICY p, Map<String, String> cond);
}
// 查詢入口
public final class CommonLocalQuery<T extends Map<String, Object>> {
public List<T> query(List<T> data, HashHashMap<POLICY, String, String> cond) {
if (data == null || cond == null) return new ArrayList<>();
Filter chain = new FilterNormal();
chain.setNext(new FilterBetween()).setNext(new FilterFuzzy());
List<T> result = new ArrayList<>();
for (T row : data) {
boolean ok = true;
for (POLICY p : cond.getFirstKeys()) {
if (!chain.doFilter(row, p, cond.get(p))) { ok = false; break; }
}
if (ok) result.add(row);
}
return result;
}
}
var q = new HashHashMap<POLICY, String, String>();
q.put(POLICY.NORMAL, "name", "John");
q.put(POLICY.BETWEEN, "age", "20Φ30");
q.put(POLICY.FUZZY, "desc", "engineer");
List<Map<String, Object>> result = new CommonLocalQuery<>().query(dataList, q);