gpt4 book ai didi

java - 使用谓词验证搜索参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:47 27 4
gpt4 key购买 nike

我有一个 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 中的条件进行评估,并将序列设置为适当的真值...在本例中为“T T F F T”

在我的验证方法中,

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");

我无法超出这一点,我必须设置序列并检查它是否存在于所需的真值列表中。

我指的是之前的帖子:Filtering with truth tables

由于我是 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 类中

关于java - 使用谓词验证搜索参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42898276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com