Q:

Calculable. Expresiones con condicionales

Estoy intentando calcular una formula con java pero cuando intento usar un condicional, para que haga una cosa u otra según si un parámetro es verdadero o falso. Añado método.
public void calcular (){
    Calculable calc = null;
    try {
        calc = new ExpressionBuilder("(4-2)/100").build();
    } catch (UnknownFunctionException e) {
        e.printStackTrace();
    } catch (UnparsableExpressionException e) {
        e.printStackTrace();
    }
    double result1=calc.calculate();
}

Esto funciona perfecto pero cuando intento ponerle algo así en la expresión no funciona:
(30>20 ? 3+2 : (4-2)/100); //esto por ejemplo.

¿Alguna idea? 

A:

Asumo el uso de la librería https://www.objecthunter.net/exp4j en la versión 0.4.X:
El problema es que entre los operadores por defecto de esa biblioteca no se encuentra el operador ternario ni el operador mayor que
La solución sería añadir tú esos operadores, pero el siguiente problema es que la librería limita el número de parámetros para un operador a 1 o 2... que lo puedes solucionar definiendo una función en lugar de un operador, que no tiene esas limitaciones:
Function ternario = new Function("ternary", 3) {
    @Override
    public double apply(double... args) {
        //limitacion: no hay booleans, 0 será false y >0 sera true
        if (args[0]>0d) {
            return args[1];
        }
        return args[2];
    }
};

Operator mayorQue = new Operator(">", 2, true, Operator.PRECEDENCE_ADDITION - 1) {

    @Override
    public double apply(double[] values) {
        if (values[0] > values[1]) {
            return 1d;
        } else {
            return 0d;
        }
    }
};

Con lo que tu código podría ser algo como
double resultado=new ExpressionBuilder("ternary(30>20,3+2,(4-2)/100)")
    .operator(mayorQue)
    .function(ternario)
    .build().evaluate();

Finalmente, en caso de necesidad, podrías tú procesar el String recibido con el operador ternario clásico cond ? resultado1 : resultado2 y transformarlo a ternary(cond,resultado1,resultado2), pero eso queda ya fuera del ámbito de la pregunta.

