Evaluar expresiones aritméticas en java

De ChuWiki

Java no tiene ninguna clase que permita evaluar un String como si fuera una expresión artimética. Es decir, si tenemos un String "2*x+3" y sabemos que x vale 5, no podemos evaluar esa expresión fácilmente para obtener el resultado.

Las posibles opciones son buscar alguna librería java que permita hacerlo o bien hacernos nosotros el código.

Sin embargo, desde java 6 existe otra posibilidad. Java 6 viene con clases que permiten ejecutar trozos de código escrito en javascript. Esa expresión que tenemos en String se puede considerar como un trozo de javascript que queremos ejecutar y cuyo resultado será el resultado de la expresión.

El código para conseguirlo es el siguiente:

package com.chuidiang.ejemplos.eval;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * Evaluar expresiones aritméticas usando javascript.
 * 
 * @author Chuidiang
 */
public class PruebaEval {

    /**
     * @param args
     */
    public static void main(String[] args) {

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");

        engine.put("X", 3);

        try {
            Object operation = engine.eval("5*X+3*2");
            Object operation2 = engine.eval("(X+3)");
            System.out.println("Evaluado operacion 1: " + operation);
            System.out.println("Evaluado operacion 2: " + operation2);
        } catch (ScriptException e) {
            e.printStackTrace();
        }

    }
}

Hemos instanciado un ScriptEngineManager y con él hemos obtenido un ScriptEngine para javascript. En ese engine podemos poner las propiedades que queramos y, en este ejemplo concreto, el valor de x igual 3.

Finalmente, nos basta llamar a engine.eval() pasando la expresión aritmética como un String. El resultado devuelto será un Object que dependerá del resultado del script. En este caso, nuestro Object será realmente un Double. Así que la salida de este programa será

Evaluado operacion 1: 21.0
Evaluado operacion 2: 6.0

Por supuesto, la expresión no tiene que ser solamente matemática, puede ser cualquier trozo de código javascript válido.