2016-11-24 19 views
1

在Java中是否存在一些標準方式來表示操作來測試一個Predicate是否比另一個Predicate更嚴格?用API表示一個操作來測試一個`Predicate`是否比另一個`Predicate`更嚴格?

我能想象像pred1.isStricterThan(pred2),但是我沒有看到在API這樣的事:https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.htmlhttps://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Predicate.html

這種類型的支票可能對例如重新使用緩存的搜索結果。

我看到isEqual()equals(),這可能是有益的,但也有進一步的優化可能...

編輯:

例子:

  1. string.contains("xy")是嚴格比string.contains("x")
  2. string.contains("xy") && string.contains("ab")嚴格不僅僅是string.contains("xy")
  3. x > 3是嚴格比x > 2
  4. string.contains("abc")不嚴格比string.contains("cd")

的嚴格檢查方法當然會必須巧妙地實施逐案。

編輯2 & 3:當用於過濾時,更嚴格的謂詞應該返回一個不太嚴格的謂詞的子集。

編輯4:注意:我不是要求實現。相反,我問是否有一些API以標準方式表達這些檢查。

+3

什麼*確切*你的意思是「更嚴格」?如果你可以清楚而準確地定義,我的答案是可能的。 – Bohemian

+1

@Bohemian - 我假設這意味着對於在同一個域中操作的兩個謂詞,更嚴格的謂詞的'test()'方法(對於Java版本)將返回「true」,以表示較不嚴格的謂詞的子集評估爲「真實」,沒有別的。 –

+0

@波希米亞:謝謝,我已經添加了3個例子和1個反例 – KarolDepka

回答

1

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

+0

這需要有人設置一個包含所有條件的圖,並且存在無限多的條件,因此該圖將使用大量內存。 –

+0

@ ChaiT.Rex「嚴格檢查方法當然必須巧妙實施」(KarolDepka)。一個單一的代碼庫必須具有有限數量的謂詞來定義其嚴格性。 – mfulton26

+0

問題是關於一個名爲'isStricterThan'的方法,它的標準庫中有兩個Predicate Java類,它允許所有的謂詞,而不僅僅是一些謂詞。如果將可能的搜索僅限於幾個示例,則重用緩存搜索結果的示例使用是沒有意義的。很少有人實現只能搜索手動輸入的謂詞列表的搜索引擎。 –

相關問題