簡體   English   中英

使用謂詞驗證搜索參數

[英]Validating search parameters using predicates

我有一個validate()方法,它檢查在rest url中傳遞的參數。 參數鏈接到如下所示的模型類

class SearchCriteria {

String regno;
String hostid;
String domid;
String location;
String provider;

/*Getters and Setters*/
}

我有一個實用程序類,用於檢查參數是否已設置。

public class SearchCriteriaUtil {

    public static boolean isRegnoSet(SearchCriteria criteria) {
        return null != criteria.getRegno();
    }

    public static boolean isHostIdSet(SearchCriteria criteria) {
        return null != criteria.getHostId();
    }

    /* Similarly for domid, location, provider */
}

我有一個謂詞,它根據util中提供的條件進行測試,並生成一個真值字符串

public class ParameterPredicate<T> implements Predicate<T>{

    final Predicate<T> predicate;
    final String sequence;

    public ParameterPredicate(Predicate<T> predicate, String sequence) {
        this.predicate = predicate;
        this.sequence = sequence;
    }

    @Override
    public String toString() {
        return sequence;
    }

    @Override
    public boolean test(T t) {
        return predicate.test(t);
    }
}

現在,基於參數set / notset,regno -set,hostid -set,domid - notset,location - notset,provider - set

我的謂詞應根據SearchCriteriaUtil中的條件進行評估,並將序列設置為適當的真值......在本例中為“TTFFT”

在我的驗證方法中,

public void validateCriteria(SearchCriteria criteria) {
            List<Predicate<SearchCriteria>> SearchCriteriaPredicate = Arrays.asList(SearchCriteriaUtil::isRegnoSet, SearchCriteriaUtil::isHostIdSet,
                    SearchCriteriaUtil::isDomidSet,
                    SearchCriteriaUtil::isLocationSet,
                    SearchCriteriaUtil::isProviderSet,

Collection<String> desired = Arrays.asList("T F F F F", "T F T T F", "T F T T F", "T F F F T", "T F F F T", "F T F F F");

我無法超越這一點,我必須設置序列並檢查它是否存在於所需的真值列表中。

我正在引用上一篇文章: 使用真值表過濾

因為我是java 8的新手,所以對任何幫助表示贊賞。

而不是使用util類並處理字符串以檢查條件的組合是否有效,為什么不在SearchCriteria類中添加類似以下的內容:

public boolean hasDesiredCombination() {
    return Criterion.DESIRED_COMBINATONS.contains(
            Arrays.stream(Criterion.values())
            .filter(s -> s.predicate.test(this))
            .collect(Collectors.toCollection(
                    () -> EnumSet.noneOf(Criterion.class)))
            );
}

private static enum Criterion {
    REGNO(s -> s.regno != null),
    HOSTID(s -> s.hostid != null),
    DOMID(s -> s.domid != null),
    LOCATION(s -> s.location != null),
    PROVIDER(s -> s.provider != null);

    private static Set<Set<Criterion>> DESIRED_COMBINATONS =
            new HashSet<>(Arrays.asList(
                    EnumSet.of(REGNO),
                    EnumSet.of(REGNO, DOMID, LOCATION),
                    EnumSet.of(REGNO, PROVIDER),
                    EnumSet.of(HOSTID)
                    ));

    private Predicate<SearchCriteria> predicate;

    private Criterion(Predicate<SearchCriteria> predicate) {
        this.predicate = predicate;
    }
}

好處:

  • 您不一定要公開getter和setter
  • 從源代碼中可以立即看出需要哪些組合
  • 邏輯是它所屬的地方:(間接)在SearchCriteria類中

我不確定ParameterPredicate的用途是什么,但是如果我理解正確,你需要檢查驗證組合( SearchCriteriaPredicate )是否與預定義集合( desired )匹配。 如果是這樣,應該這樣做:

String sequence = SearchCriteriaPredicate.stream()
        .map(p -> p.test(criteria) ? "T" : "F")
        .collect(Collectors.joining(" "));

return desired.contains(sequence);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM