我正在尝试将条件语句(尚未评估)作为参数发送到方法。我知道在java8中,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" );
}
}
我已经尝试了此设置的许多变体。每次我都会收到不同的错误:)
您快到了,您可以更改签名以接收布尔供应商,该供应商仅在调用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" );
将正确编译(请注意,我删除了不必要的括号)。