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 🙂
Problema: Desarrollar un juego en consola con Kotlin que genere un numero aleatorio entre un rango preestablecido y perm[...]
Segunda y ultima parte del post dedicado a la creación de un microservicio en lenguaje java utilizando el framework Spar[...]
iSQL: Es una herramienta de linea de comandos que acompaña a Firebird, se encuentra en la carpeta BIN, sirve para realiz[...]
AssertJ Swing es una biblioteca para Java que proporciona una interfaz fluida para la realización automatizada de prueba[...]
Los procedimientos almacenados no solo pueden retornar valores como números, cadenas, etc, sino también datos como los R[...]
Video Tutorial que muestra una de las maneras de utilizar y mostrar imagenes en iReport, pasando estas como parametros d[...]