Nudziłem się podczas sezonu wakacyjnego w tym roku i losowo zdecydowałem się napisać prostą bibliotekę ze zrozumieniem/filtrowaniem list dla Javy (wiem, że jest tam kilka świetnych rzeczy, po prostu chciałem napisać to dla siebie, do diabła) .Wskazówki do parsowania wyrażenia ciągu?
Na tej liście:
LinkedList<Person> list = new LinkedList<Person>();
list.add(new Person("Jack", 20));
list.add(new Person("Liz", 58));
list.add(new Person("Bob", 33));
Składnia jest następująca:
Iterable<Person> filtered = Query.from(list).where(
Condition.ensure("Age", Op.GreaterEqual, 21)
.and(Condition.ensure("Age", Op.LessEqual, 50));
znam jej brzydki, ale jeśli mogę użyć importu statyczne i używać krótszych nazwy metod staje się dość zwięzłe.
Poniższa składnia jest ostatecznym celem:
Iterable<Person> list2 = Query.from(list).where("x=> x.Age >= 21 & x.Age <= 50");
Widocznie parsowania wyrażenie nie jest moją najsilniejszą obszar, im kłopoty z analizowania zagnieżdżone/wielokrotny warunkowe. Czy ktoś zna jakieś zasoby/literaturę, które mogą okazać się pomocne?
Mam tylko pojedyncze wyrazy warunkowe, które zostały pomyślnie przetworzone z String składni lambda w tej chwili: "x=> x.Name == Jack"
. Moja podstawowa struktura Wyrażenia jest dość solidna i może z łatwością obsłużyć dowolną ilość zagnieżdżania, problemem jest tylko parsowanie wyrażenia z ciągu znaków.
Dzięki
tylko dla zabawy, tutaj jest trochę wgląd w jaki sposób struktura wyrażenie za kulisami mogą pracować (oczywiście mógłbym określić „op.GreaterEqual”, itp ... w poniższym przykładzie, ale chciałem pokazać, jak to jest elastyczna do dowolnej ilości zagnieżdżenia):
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 "' nie robi do końca parsowania dla mnie: czy mógłbyś to rozwinąć? Przed '&' znajduje się trzy wyrażenia, które bardzo różnią się od klauzul stylu wanilii sql. – Chii
Nie mam zamiaru pisać dostawcy, aby połączyć moje narzędzia do relacyjnej bazy danych, chociaż może to być zabawne. Dokładnie to, o co proszę mnie szczegółowo omówić? – jdc0589
@Chii: Myślę, że "x => x.Age> = 21 & x.Age <= 50" jest odpowiednikiem anonimowej funkcji, która pobiera argument x i zwraca wartość true lub false, oceniając wyrażenie po prawej stronie Operator "=>". – MAK