2016-11-24 15 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类,它允许所有的谓词,而不仅仅是一些谓词。如果将可能的搜索仅限于几个示例,则重用缓存搜索结果的示例使用是没有意义的。很少有人实现只能搜索手动输入的谓词列表的搜索引擎。 –

相关问题