Me aburrí durante la temporada de vacaciones de este año y al azar decidí escribir una lista simple de biblioteca de comprensión/filtrado para Java (sé que hay algunos excelentes por ahí, solo quería escribirlo por mi propia cuenta) .Sugerencias de análisis de expresión de cadena?
para esta lista:
LinkedList<Person> list = new LinkedList<Person>();
list.add(new Person("Jack", 20));
list.add(new Person("Liz", 58));
list.add(new Person("Bob", 33));
sintaxis es:
Iterable<Person> filtered = Query.from(list).where(
Condition.ensure("Age", Op.GreaterEqual, 21)
.and(Condition.ensure("Age", Op.LessEqual, 50));
Sé que es feo, pero si uso importaciones estáticos y uso más cortos nombres de los métodos que se convierte en bastante conciso.
La siguiente sintaxis es el objetivo final:
Iterable<Person> list2 = Query.from(list).where("x=> x.Age >= 21 & x.Age <= 50");
Al parecer, el análisis de expresión no es mi área más fuerte, estoy teniendo problemas con el análisis de las condiciones anidadas/múltiple. ¿Alguien sabe de algunos recursos/literatura que pueda ser útil?
Solo tengo expresiones condicionales individuales analizadas con éxito desde la sintaxis String lambda en este momento: "x=> x.Name == Jack"
. Mi estructura de Expresión subyacente es bastante sólida y puede manejar fácilmente cualquier cantidad de anidamiento, el problema es solo la expresión que se analiza desde una cadena.
Gracias
Sólo por diversión, aquí hay una pequeña idea de cómo la estructura de expresión detrás de las escenas puede trabajar (obviamente que podría haber especificado 'op.GreaterEqual', etc ... en el siguiente ejemplo, pero quería demostrar cómo es flexible a cualquier cantidad de anidación):
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 "' no es suficiente para mí: ¿podría elaborarlo? hay tres expresiones delante del '&', que es muy diferente de las cláusulas de estilo sql de vanilla. – Chii
No tengo la intención de escribir un proveedor para vincular mis utilidades a una base de datos relacional, aunque podría ser divertido. Exactamente ¿qué me pides que elabore? – jdc0589
@Chii: Creo que "x => x.Age> = 21 & x.Age <= 50" es equivalente a una función anónima que toma un argumento x y devuelve verdadero o falso al evaluar la expresión a la derecha de la '=>' operador. – MAK