私は今年のホリデーシーズンに飽きて、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");
どうやら式の解析は私の最強の領域ではなく、ネストされた/複数の条件の解析に問題があります。誰かが私が役立つと思うかもしれないいくつかのリソース/文学を知っていますか?
現時点では、文字列ラムダ構文から正常に解析されている条件式は1つだけです"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);