【发布时间】:2010-01-17 07:54:34
【问题描述】:
我在今年的假期里感到无聊,随机决定为 Java 编写一个简单的列表理解/过滤库(我知道那里有一些很棒的库,我只是想自己写一个) )。
对于这个列表:
LinkedList<Person> list = new LinkedList<Person>();
list.add(new Person("Jack", 20));
list.add(new Person("Liz", 58));
list.add(new Person("Bob", 33));
语法是:
Iterable<Person> filtered = Query.from(list).where(
Condition.ensure("Age", Op.GreaterEqual, 21)
.and(Condition.ensure("Age", Op.LessEqual, 50));
我知道它很难看,但是如果我使用静态导入并使用较短的方法名称,它会变得非常简洁。
以下语法是最终目标:
Iterable<Person> list2 = Query.from(list).where("x=> x.Age >= 21 & x.Age <= 50");
显然表达式解析不是我最擅长的领域,我在解析嵌套/多个条件时遇到了麻烦。有人知道我可能会觉得有用的一些资源/文献吗?
我目前只有一个条件表达式从 String lambda 语法成功解析:"x=> x.Name == Jack"。我的底层表达式结构相当稳固,可以轻松处理任意数量的嵌套,问题只是从字符串中解析表达式。
谢谢
只是为了好玩,这里有一点关于幕后表达式结构如何工作的见解(显然我可以在下面的示例中指定'op.GreaterEqual'等......但我想演示如何它对任何数量的嵌套都很灵活):
Condition minAge1 = Condition.ensure("Age", Op.Equal, 20);
Condition minAge2 = Condition.ensure("Age", Op.Greater, 20);
Expression minAge = new Expression(minAge1, Express.Or, minAge2);
Expression maxAge = Condition.ensure("Age", Op.Equal, 50).or(Condition.ensure("Age", Op.Less, 50));
Expression ageExpression = new Expression(minAge, Express.And, maxAge);
Condition randomException = Condition.ensure("Name", Op.Equal, "Liz");
Expression expressionFinal = new Expression(ageExpression, Express.Or, randomException);
【问题讨论】:
-
"x=> x.Age >= 21 & x.Age <= 50"不太适合我:你能详细说明一下吗?&前面有三个表达式,这与普通的 sql 样式子句有很大不同。 -
我不打算编写提供程序来将我的实用程序链接到关系数据库,尽管这可能很有趣。你到底要我详细说明什么?
-
@Chii:我认为,"x=> x.Age >=21 & x.Age ' 运算符右侧的表达式。
标签: java parsing lambda list-comprehension