Мне стало скучно во время курортного сезона в этом году, и я случайно решил написать простую библиотеку для понимания и фильтрации списков для 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");
Очевидно, синтаксический анализ выражений - не самая сильная моя область, у меня проблемы с анализом вложенных / множественных условных выражений. Кто-нибудь знает о некоторых ресурсах / литературе, которые могут оказаться полезными для меня?
Я получил только одно условное выражение, которое в данный момент успешно анализируется из строкового лямбда-синтаксиса: "x=> x.Name == Jack"
. Моя базовая структура Expression довольно прочная и может легко обрабатывать любое количество вложений, проблема заключается только в анализе синтаксического выражения из строки.
Спасибо
Для простоты, вот небольшое понимание того, как может работать структура выражения за кулисами (очевидно, я мог бы указать «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);