Java 8 trae consigo una nueva versión del motor de JavaScript llamada Nashorn, este motor introduce mejoras de rendimiento y compatibilidad con las nuevas características del lenguaje.
A continuación vamos a ver un ejemplo de cómo usar librerías escritas en JavaScript desde Java para evaluar expresiones matemáticas.
Necesitamos:
Paso 1. El Proyecto
Crea un nuevo proyecto Java Application que se llamara «JavaMathJS» y crea los paquetes necesarios, crea también una clase Main. Descarga la librería «math.min.js» y añade al paquete donde esta la clase main como se ve en la siguiente imagen.
Paso 2. El Código
Abre la clase Main y añade los siguientes import
import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException;
Creamos una instancia al manejador de Script de Java
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn");
Cargamos la librería JavaScript que en est ejemplo estara en el mismo paquete que nuestra clase java
InputStream inputStream = Main.class.getClass().getResourceAsStream("/net/jc_mouse/math/math.min.js"); Reader reader = new InputStreamReader(inputStream, "utf-8"); engine.eval(reader);
Podemos, claro esta cargar el archivo JS desde otra ubicación en el disco, incluso desde Internet
Finalmente si queremos hacer uso de funciones propias de la librería «math.min.js«, hacemos lo siguiente:
//se evalua en javascript la expresion matematica engine.eval("var value = math.atan2(3, -3) / math.pi; "); //recupera el valor de la variable evaluada Object object = engine.get("value"); //imprime en consola System.out.println("Expresion matematica"); System.out.println("math.atan2(3, -3) / math.pi es igual a: " + object);//0.75
A continuación la clase final más unos ejemplos :
import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /** * @see https://www.jc-mouse.net/ * @author Mouse */ public class Main { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); try{ //se carga archivo JS en memoria InputStream inputStream = Main.class.getClass().getResourceAsStream("/net/jc_mouse/math/math.min.js"); Reader reader = new InputStreamReader(inputStream, "utf-8"); engine.eval(reader); /*------ Ejemplo 1 ------*/ //se evalua en javascript la expresion matematica engine.eval("var value = math.atan2(3, -3) / math.pi; "); //recupera el valor de la variable evaluada Object object = engine.get("value"); //imprime en consola System.out.println("Expresion matematica"); System.out.println("math.atan2(3, -3) / math.pi es igual a: " + object);//0.75 /*------ Ejemplo 2 ------*/ //Operaciones encadenadas engine.eval("var value = math.chain(3)\n" + " .add(4)\n" + " .multiply(2)\n" + " .done(); "); object = engine.get("value"); System.out.println("Operaciones encadenadas"); System.out.println("math.chain(3).add(4)..multiply(2).done() es igual a " + object);//14 /*------ Ejemplo 3 ------*/ //evaluar expresiones matematicas engine.eval("var value = math.eval('sqrt(3^2 + 4^2)'); "); object = engine.get("value"); System.out.println("Evaluar expresiones matematicas"); System.out.println("sqrt(3^2 + 4^2) = " + object);// 5 /*------ Ejemplo 4 ------*/ //definir funciones engine.eval("var f = math.eval('f(x) = x ^ a', {a:3});"); engine.eval("var value = f(2);"); object = engine.get("value"); System.out.println("Definir funciones"); System.out.println("f(x)=x^a donde a=3 es igual " + object);// 8 }catch (ScriptException ex) { System.err.println(ex.getMessage()); } catch (UnsupportedEncodingException ex) { System.err.println(ex.getMessage()); } } }
Ejecutando tenemos:
Eso es todo 🙂
Tiempo atras me pidieron un ejemplo de como realizar un reporte con iReport tipo factura, recibo o como le llamen, compl[...]
En este tutorial crearemos un interesante efecto de explosión al momento de abrir un JPanel, este efecto puede extenders[...]
En este tutorial realizaremos un proyecto web de un «sitio multi lenguaje» o «web multi idiomas» como prefieran llamarlo[...]
El control de paginación de JavaFX (Pagination) se usa para navegar a través de varias paginas de contenido divididas en[...]
Slim es un micro framework para PHP que nos ayuda a escribir rápidamente aplicaciones Web y APIs sencillas pero poderosa[...]
En este post, escribiremos un sencillo plugin para wordpress el cual consistirá en reemplazar palabras en los comentario[...]