哈哈,好了不開玩笑了,今天的主角就是java8的新特性Nashorn JavaScript(完全支持ECMAScript 5.1規範以及一些擴展),簡單來說,就是可用通過它實現,java和javascript代碼的互相調用。當然,其實這個特性java8以前就有(Rhino),只不過java8這個新的對以前進行了優化。
至於怎麼用呢?讓我們看下面這個例子。
我們都知道,javascript裏面有個函數eval(String),可以對傳入的合法字符串參數進行計算。下面讓我們通過java調用javascript的eval函數進行計算表達式:
package Test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Cal {
public static Object calculate(String s){
Object object = null;
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
try {
object = nashorn.eval(s);
} catch (ScriptException e) {
object = "請輸入正確表達式!!! please input the correct formula!!!";
}
return object;
}
public static void main(String[] args) {
System.out.println(calculate("(347+34.5)/(75-72)+34**3").toString());
}
}
當然這種寫法,在自己本地還可以運行,如果你想用這個方法過oj?額,反正我是沒成功過。。。
當然除此之外,你還可以jjs命令行工具,用js代碼進行交互(先要安裝好並配置好java8環境)。
jjs
jjs是個基於Nashorn引擎的命令行工具。它接受一些JavaScript源代碼爲參數,並且執行這些源代碼。
例如,我們創建一個具有如下內容的sample.js文件:
print('Hello World!');
打開控制檯,輸入以下命令:
$ jjs sample.js
以上程序輸出結果爲:
Hello World!
jjs 交互式編程
打開控制檯,輸入以下命令:
$
jjs //進入控制檯輸入jjs指令
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
傳遞參數
打開控制檯,輸入以下命令:
$ jjs -- a b c
jjs> print('字母: ' +arguments.join(", "))
字母: a, b, c
jjs>
JavaScript 中調用 Java
var BigDecimal = Java.type('java.math.BigDecimal');
function calculate(amount, percentage) {
var result = new BigDecimal(amount).multiply(
new BigDecimal(percentage)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
return result.toPlainString();
}
var result = calculate(568000000000000000023,13.9);
print(result);
我們使用 jjs 命令執行以上腳本,輸出結果如下:
$ jjs sample.js
78952000000000002017.94
但java11中此特性好像又會被移除。。。
歡迎關注公衆號BatFor