今年假期我很無聊,隨機決定爲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");
顯然表達分析是不是我與解析嵌套/多條件語句最強的區域,有IM麻煩。任何人都知道我可能會找到一些有用的資源/文獻?
我只有一個條件表達式正在從字符串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「'對我沒有很好的解析:你能說清楚嗎? 在'&'前面有三個表達式,這與vanilla sql style子句非常不同。 – Chii 2010-01-17 08:04:42
我不打算寫一個提供程序將我的實用程序鏈接到關係數據庫,儘管它可能很有趣。 到底你在問我詳細說明一下? – jdc0589 2010-01-17 08:14:17
@Chii:我認爲,「x => x.Age> = 21&x.Age <= 50」相當於一個匿名函數,它接受一個參數x,並通過計算右邊的表達式來返回true或false '=>'操作符。 – MAK 2010-01-17 09:14:17