2016-04-29 2 views
4

Ich versuche, eine Bedingung (die noch nicht ausgewertet wurde) als Argument für eine Methode zu senden. Ich verstehe, dass in java8 die Lambda-Ausdruck ist der Weg, es zu tun (effektiv setzen die Bedingung in eine Funktion und Senden der Funktion).Wie kann ich eine Bedingung an eine Methode senden, die Lambda-Ausdruck verwendet, damit sie noch nicht ausgewertet wird?

// 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"); 
     } 
    } 

Ich habe viele Variationen dieses Setup ausprobiert. Ich erhalte unterschiedliche Fehler jedes Mal :)

Antwort

6

Sie fast da waren, können Sie Ihre Signatur ändern, um eine BooleanSupplier zu erhalten, die die Bedingung wird nur bewerten, wenn getAsBoolean aufrufen.

Hier ein einfaches Beispiel:

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; 
     } 
    } 
} 

Wenn Sie durch dieses Beispiel im Debug-Modus gehen, werden Sie sehen, dass die Bedingung a != null && a.get() nur ausgewertet, wenn condition.getAsBoolean() ausgeführt wird.

Angewandt auf Ihrem Beispiel würden Sie nur

void do_assertions(boolean argb , String args) 

für

void do_assertions(BooleanSupplier argo_supplier , String args) 

und rufen Sie dann argo_supplier.getAsBoolean() ändern müssen, wo Sie den Zustand bewerten wollen (nach pvb_debuggable Überprüfung).

dann Ihre Linie

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

würde kompiliert richtig (man beachte, dass ich die unnötigen Klammern entfernt).

+2

@ Jean-FrançoisSavard: Es scheint, dass die Android N-Plattform Unterstützung für Java 8 Sprachfunktionen hat. – scottb

+0

Ich denke, Sie haben in erster Linie Recht ... aus der Box AS2 wird mit der jdk1.8. *, Aber wird nicht tatsächlich viele der tatsächlichen Funktionen java8 (wie Lambda) aktivieren ... ein paar Optionen scheinen zu existieren : ** 1 ** -> _Java 8 Features aktivieren und die Jack Toolchain_ (http://developer.android.com/preview/j8-jack.html#configuration) ... ... oder ** 2 ** -> _Android N führt die Unterstützung für Java 8-Sprachfeatures_ ein (http://developer.android.com/preview/j8-jack.html#configuration ... ... damit scheint Ihre Antwort ... die Antwort ... danke ... – dsdsdsdsd

Verwandte Themen