我在今年的假期里感到无聊,随机决定为 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);