java延迟函数_Java 8:延迟计算
Java8:Stream概念的細化,討論延遲計算/惰性求值Lazy Evaluations。
Java中常見的邏輯操作be1&&f(),是短路/short-circuiting計算,避免了執行不必要的表達式或方法調用。它使用的就是惰性求值或者說正常順序/normal order(SICP中譯為正則序);與此同時,方法實參的求值是饑餓或者說應用序/applicative order,在方法被調用前,所有的實參通通被求值,即使方法中不使用某些實參也被求值。
JDK中,Stream的中間函數如?filter(Predicate super T>)是惰性求值的,filter并非對流中所有元素調用傳遞給它的Predicate,Java8:Stream概念中我們見過,調換map()和filter()函數的調用順序,可以減少函數執行的次數。我們可以借鑒它,設計方法實參的惰性求值,手段是將形參轉化為函數接口,因為實參的lambda表達式在被調用時才求值。
例如有一個方法執行很長時間的運算(sleep模擬)后返回i>0。
public static boolean isPositive(int i) {
pln("test ..." + i);
sleep(1000);//
return i > 0;
}
因為方法實參的求值是饑餓的,對于下面的代碼
public static void eagerTest(boolean be1, boolean be2) {//方法實參的求值是饑餓的
pln(be1 && be2); //實參
isPositive(-1) && isPositive(2); //&&是短路的
}執行eagerTest(isPositive(-1), isPositive(2));的輸出為:
test ...-1
test ...2
false
test ...-1
false
實參的lambda表達式在被調用時才求值
public static void lazyTest(Supplier supplier1, Supplier supplier2) {
pln((supplier1.get() && supplier2.get()));
}
static class imp implements Supplier{
@Override public ?Boolean get(){
return isPositive(-2);
}
}
public static void test() {
//eagerTest(isPositive(-1), isPositive(2));
pln("lazyTest-------------1");
lazyTest(() -> isPositive(-1), () -> isPositive(2));
pln("lazyTest-------------2");
lazyTest( new imp(), () -> isPositive(2) ?);
pln("lazyTest-------------3");
lazyTest( new Supplier(){
@Override public ?Boolean get(){
return isPositive(-3);
}
}, () -> isPositive(3) ?);
}執行test()的輸出為:
lazyTest-------------1
test ...-1
false
lazyTest-------------2
test ...-2
false
lazyTest-------------3
test ...-3
false
在進入lazyTest方法體之前,作為實參的兩個lambda表達式并沒有求值,而在調用supplier1.get()時才會求值。
總結
以上是生活随笔為你收集整理的java延迟函数_Java 8:延迟计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java语言描述一个行为_设计模式之责任
- 下一篇: java椭圆 类_java 椭圆算法