你所描述的是一个graph。您可以使用谷歌番石榴的新graph API界定谓词严格图和查询它:
Predicate<String> containsX = string -> string.contains("x");
Predicate<String> containsXy = string -> string.contains("xy");
Predicate<String> containsXyAndAb = string -> string.contains("xy")
&& string.contains("ab");
Predicate<Integer> greaterThan2 = x -> x > 2;
Predicate<Integer> greaterThan3 = x -> x > 3;
Predicate<String> containsAbc = string -> string.contains("abc");
Predicate<String> containsCd = string -> string.contains("cd");
MutableGraph<Predicate<?>> predicateStrictnessGraph = GraphBuilder.directed().build();
predicateStrictnessGraph.addNode(containsX);
predicateStrictnessGraph.addNode(containsXy);
predicateStrictnessGraph.addNode(containsXyAndAb);
predicateStrictnessGraph.addNode(greaterThan3);
predicateStrictnessGraph.addNode(containsAbc);
predicateStrictnessGraph.addNode(containsCd);
predicateStrictnessGraph.putEdge(containsXy, containsX);
predicateStrictnessGraph.putEdge(containsXyAndAb, containsXy);
predicateStrictnessGraph.putEdge(greaterThan3, greaterThan2);
boolean isContainsXyStricterThanContainsX =
Graphs.reachableNodes(predicateStrictnessGraph, containsXy)
.contains(containsX);
// result: true
boolean isContainsXyStricterThanContainsXyAndAb =
Graphs.reachableNodes(predicateStrictnessGraph, containsXy)
.contains(containsXyAndAb);
// result: false
为了进一步说明这一点考虑查询的图形谓词超过指定的谓词严格:
Predicate<String> containsAb = string -> string.contains("ab");
predicateStrictnessGraph.addNode(containsAb);
predicateStrictnessGraph.putEdge(containsAbc, containsAb);
predicateStrictnessGraph.putEdge(containsXyAndAb, containsAb);
Set<Predicate<?>> containsAbAndStricterPredicates =
Graphs.reachableNodes(Graphs.transpose(predicateStrictnessGraph), containsAb);
// result: [containsAb, containsAbc, containsXyAndAb]
有关详细信息,见GraphsExplained · google/guava Wiki。
什么*确切*你的意思是“更严格”?如果你可以清楚而准确地定义,我的答案是可能的。 – Bohemian
@Bohemian - 我假设这意味着对于在同一个域中操作的两个谓词,更严格的谓词的'test()'方法(对于Java版本)将返回“true”,以表示较不严格的谓词的子集评估为“真实”,没有别的。 –
@波希米亚:谢谢,我已经添加了3个例子和1个反例 – KarolDepka