7

Lambdaj(和其他一些类似的库)提供了一个having函数,允许我像这样定义谓词(直接来自lambdaj 功能页面的示例):

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);

我非常希望能够使用简单的字符串语法来定义我的 Java 谓词对象"age > 30"——类似于 SQL where 子句——所以上面的过滤器变成了这样:

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends);

是否存在这样的库,或者任何人都可以为我自己构建的查询解析部分推荐一些构建块?我实际上并不介意它创建什么样的谓词(hamcrest、guava 等)。

在我的脑海中,我可以想到它支持的许多事情:平等和不等式,自定义和原始类型,和/或/不是,括号,LIKE(用于字符串),in(...)枚举的解释名称,属性的属性。

这是一个更复杂的谓词的示例:

"salesCount > 10 and (country='UK' or city='New York')
and attitude not in (MENACING, RUDE)
and product.name <> 'Widget' "

(此示例假定应用谓词的类(例如SalesPerson类)具有方法 getSalesCount()、getCountry() 和 getCity(),以及 getAttitude()(返回枚举)。它还有一个属性getProduct,它返回一个带有方法 getName 的类型)。

动机:我们有一个客户端-服务器系统,它有多种语言 API(目前是 Java 和 C#);我正在为用户寻找一种与语言无关的方式来指定一个谓词,该谓词过滤一组对象,这些对象的确切内容只有服务器进程(用 Java 编写)知道。

4

2 回答 2

2

我会看看MVEL。它支持类似的表达式:

(user.name == 'John Doe') && ((x * 2) - 1) > 20

曾经在项目中使用它来表达客户的一些基本业务规则。

于 2012-11-06T08:51:28.647 回答
0

不确定这样的库是否已经存在,但您可以使用 groovy 即时编译/评估此类表达式。

于 2012-11-05T18:23:29.087 回答