如何使用 lambda 表达式将条件发送到方法,以便尚未对其进行计算



我正在尝试将条件语句(尚未评估)作为参数发送到方法。我知道在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" );

将正确编译(请注意,我删除了不必要的括号)。

相关内容

  • 没有找到相关文章

最新更新