Lambdaj(和其他一些类似的库)提供了一个 having
函数,它允许我像这样定义谓词(示例直接来自 lambdaj Features 页面):
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);
是否存在这样的库,或者任何人都可以为我自己构建一个可以用来构建查询解析部分的构建 block 推荐一些构建 block 吗?我实际上并不介意它创建什么样的谓词(hamcrest、 Guava 等)。
在我的脑海中,我想到了很多它支持的东西:等式和不等式,自定义和原始类型,和/或/不,括号,LIKE
(for Strings),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 编写)知道。
最佳答案
关于java - 是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237998/