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 编写)知道。