你所描述的是一個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