2016-04-29 54 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