lambda表達式的出現使得JDK8內部發生了很多有趣的變化, 其中就包括惰性計算的特性.
這里以JDK標準庫中的Logger為例, 1.8以前的log方法有如下簽名:
public void log(Level level, String msg) { if (!isLoggable(level)) { return; } LogRecord lr = new LogRecord(level, msg); doLog(lr); }也就是說客戶端程序調用log方法的時候, 無論最終是否觸發log行為, msg
始終是要被計算的. 若計算msg
是非常耗時的行為, 那么無疑會造成不必要的開銷. 下面是一個調用的例子:
在java 1.8版本出現之后, 該方法多了如下重載:
public void log(Level level, Supplier<String> msgSupplier) { if (!isLoggable(level)) { return; } LogRecord lr = new LogRecord(level, msgSupplier.get()); doLog(lr); }Supplier
是一個FunctionalInterface
, 也就是說現在的log
方法可以接受一個無參的lambda表達式作為參數, 而計算的過程也被延遲到了supplier.get()
的調用時. 改進后的調用例子:
新聞熱點
疑難解答