Отправить команду в функцию - PullRequest
0 голосов
/ 19 сентября 2018

как я могу отправить команду функции, например.

{
    {
    boolean b;

    Do(b, b = false);
    }

    public void Do (boolean b,Command command)
    {
        if (b == true)
        {
            command;
        }
    }

}

, поэтому, если b = true, в этом примере должно быть установлено значение false.есть идеи ?Я использую Android Studio - Java Спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Сначала определите структуру вашей команды.Вам необходимо определить точные # и типы каждого аргумента, который должна принимать ваша «команда», что возвращает вызов «command» (какой тип) и какие проверенные исключения можно выдавать, если таковые имеются.

Как только вы определились с этим, либо найдите соответствующий существующий функциональный интерфейс, либо создайте его самостоятельно.

Что такое функциональный интерфейс?Просто интерфейс, в котором есть ровно 1 (не по умолчанию) метод.Например, java.lang.Runnable определено так:

public interface Runnable {
    void run();
}

, что означает: эта команда не принимает аргументов, ничего не возвращает и не может генерировать какие-либо проверенные исключения.

Как только высделано все, что вы можете создать их довольно легко.Это действует как объект, поэтому вы можете просто вызвать .run() для результата:

public void test() {
    Runnable r = () -> System.out.println("Hello!");
    doTwice(r);
    // you can one-liner it too of course:
    doTwice(() -> System.out.println("World!"));
}

public void doTwice(Runnable r) {
    r.run();
    r.run();
}

Выше будет напечатано 'Hello!'дважды, а затем «Мир!»дважды.

Однако в своем псевдокоде вы пытаетесь изменить значение локальной переменной внутри кода, который вы «отправляете» другому методу.Это не разрешено в Java;любые локальные переменные, используемые в одном из этих блоков кода, должны быть эффективно финальными, что означает: они инициализируются ровно один раз и никогда не изменяются снова.

Выход из дилеммы состоит в том, чтобы сделать AtomicBoolean, которыйэто изменчивый объект.Тогда вы получите что-то вроде:

AtomicBoolean b = new AtomicBoolean(false);
runTwice(()-> b.set(true));
System.out.println(b); // Prints true

Вы спрашивали об Android;вышеупомянутые функции были введены в java 8. Хотя java 8 уже почти 5 лет, android - более или менее форк java, и он был разветвлен до того, как была введена java 8.Я не знаю, поддерживает ли Android эти конструкции.Google или спросите, поддерживает ли android «лямбды» (что и делает вышеупомянутый материал).

Если android поддерживает not , поддерживает lambdas, это все же возможно, но реально, очень уродливо:

runTwice(new Runnable() {
    public void run() {
        System.out.println("Hello!");
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...