2016-04-29 32 views
4

我想發送條件語句(尚未評估)作爲方法的參數。我明白在java8lambda表達式是做到這一點的方式(有效地將條件放在函數中,併發送函數)。如何將條件發送到使用lambda表達式的方法以使其尚未評估?

// simple method inside a utilities class 
// that does assertions if global debug parameter is true 

public class MyUtils 
    { 
    public static void do_assertions(boolean argb , String args) 
     { 
     if(BuildConfig.pvb_debuggable) 
      { assert argb , args ; 
      } 
     } 
    } 

// somewhere within app where a development-phase assertion is needed 

public class some_class 
    { 
    public void some_method() 
     { 
     EditText lvo_editText = (EditText) findViewById("the_id") ; 

     //assert lvo_editText != null; 
     // ... replace this with a call to do_assertions 
     MyUtils.do_assertions(() -> { lvo_editText != null ; } , "bad EditText"); 
     } 
    } 

我已經試過這種設置的許多變化。我每次都會收到不同的錯誤:)

回答

6

您幾乎在那裏,您可以更改您的簽名以接收BooleanSupplier,只有在致電getAsBoolean時纔會評估條件。

這裏一個簡單的例子:

public class Test { 

    public static void main(String args[]) { 
     A a = new A(); 
     test(() -> a != null && a.get()); 
    } 

    static void test(BooleanSupplier condition) { 
     condition.getAsBoolean(); 
    } 

    static class A { 
     boolean get(){ 
      return true; 
     } 
    } 
} 

如果你去通過這個例子在調試模式下,你會看到,當執行condition.getAsBoolean()條件a != null && a.get()僅被評估。

應用到您的示例,你只需要改變

void do_assertions(boolean argb , String args) 

void do_assertions(BooleanSupplier argo_supplier , String args) 

,然後調用argo_supplier.getAsBoolean()要評估條件(檢查pvb_debuggable後)。

那麼該訂單

MyUtils.do_assertions(() -> lvo_editText != null , "bad EditText"); 

將正確編譯(注意,我刪除了不必要的括號內)。

+2

@ Jean-FrançoisSavard:看起來Android N平臺支持Java 8語言功能。 – scottb

+0

我認爲你主要是正確的...開箱即用的AS2將處理jdk1.8。*,但實際上並不會啓用許多實際的java8功能(如lambda)......似乎存在一些選項:** 1 ** - > _啓用Java 8功能和Jack Toolchain_(http://developer.android.com/preview/j8-jack.html#configuration)... ...或** 2 ** - > _Android N引入了對Java 8語言特性的支持_(http://developer.android.com/preview/j8-jack.html#configuration .. ...就這樣說,你的答案似乎是......答案...謝謝... – dsdsdsdsd