2016-04-25 31 views
0

有一種方法,以確定一個給定的Java拉姆達對象是否是一種方法的參考或「特定調用點-」拉姆達:檢測拉姆達是否是這樣的方法參考

boolean isMethodReference(Object lambda) 

正例如:

assertTrue(isMethodReference(Object::toString)); 

負例如具有 「特定調用點-」 拉姆達:

long valueFromCallSite = System.currentTimeMillis(); 
Consumer<Object> lambda = o -> { 
    if (valueFromCallSite % 2 == 0) { 
     o.toString(); 
    } else { 
     o.hashCode(); 
    } 
}; 
assertFalse(isMethodReference(lambda)); 
+2

在實例上運行'.getClass()'將返回一個動態/合成類。你不應該依賴這個。你的程序不應該關心實例來自哪裏。 – Savior

+3

你的用例是什麼? (只是好奇,不能認爲我有理由知道/關心。) – davidbak

+0

我對這個問題的回答是「我確實希望那裏不是一種方式。」 –

回答

0

爲啓發式方法提出了在"Determine if a lambda expression is stateless or stateful in Java"

boolean isMethodReference(Object lambda) { 
    return lambda.getClass().getDeclaredFields().length == 0; 
} 

這只是一個試探,因爲它依賴於不確定的行爲,因此是JDK實現特定的,甚至在未來的版本可能會中斷。