2016年12月13日 星期二

Optional、Nashorn (java8 六)

此類是想消除null用的


※Optional

※of和ofNullable

final String str = null;
// of
// 下行java.lang.NullPointerException
Optional<String> optional1 = Optional.of(str);
System.out.println("opt1=" + optional1.get());
    
// ofNullable
Optional<String> optional2 = Optional.ofNullable(str);
// 下行java.util.NoSuchElementException: No value present
System.out.println("opt2=" + optional2.get());

※of:如果是null,不用再呼叫方法就會直接拋空指針例外

※ofNullable:如果是null,會回傳Optional.empty,如果再呼叫方法會拋NoSuchElementException 例外


※判斷

public class Test {
    public static void main(String[] args) {
        final String str = null;
    
        // if判斷
        Optional<String> optional = Optional.ofNullable(str);
        if (optional.isPresent()) {
            System.out.println(optional.get());
        } else {
            System.out.println(Optional.empty());// Optional[?] | Optional.empty
        }
    
        // 使用三元運算子判斷
        System.out.println(optional.isPresent() ? Optional.of(str) : Optional.empty());
    
        // 不用判斷
        System.out.println(optional.orElse("default value"));
    
        // 做完事再回傳
        String rtn = optional.orElseGet(() -> {
            System.out.println("do something");
            return Optional.empty().toString();
        });
        System.out.println("rtn=" + rtn);
    
        // 直接拋例外
        optional.orElseThrow(() -> new XxxException("null->exception"));
    }
}
    
class XxxException extends RuntimeException {
    public XxxException() {
        super();
    }
    
    public XxxException(String message) {
        super(message);
        System.out.println("message=" + message);
    }
}




※Nashorn

參考資料

和javascript溝通的工具jjs,也是java8新增的
在命令提示字元打上jjs -h可以看到說明

我在d槽新增一個叫jjsTest.js的檔案,內容如下:
let a = 1;
let b = 2;
print(a+b);



上圖可以看到有5個紅框,第一個紅框確定內容

第二個紅框出錯了,因為它不認識let關鍵字,因為這是es6才有的

第三個紅框加上--language=es6就認識let了

第四個紅框--後面加上要傳進去的參數,但--後面要有空格,所以出錯了

第五個紅框使用arguments.join將傳進去的參數用「, 」隔開了

離開時要打quit()



※test.java

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine nashorn = sem.getEngineByName("nashorn");
String xxx = "Hello nashorn";
try {
    nashorn.eval("print('" + xxx + "')");
    System.out.println((Integer) nashorn.eval("10 + 2"));
} catch (ScriptException e) {
    System.out.println("message=" + e.getMessage());
}

※EngineByName的字串一定要是nashorn


※jjsTest.js

var arrayList = Java.type('java.util.ArrayList');
    
function lookList() {
    var list = new arrayList;
    list.add(1);
    list.add(2);
    print(list);
}
lookList();

※Java.type就類似import

※不能加泛型

※在命令提示字元打上jjs jjsTest.js可看到結果

沒有留言:

張貼留言