Сначала определите структуру вашей команды.Вам необходимо определить точные # и типы каждого аргумента, который должна принимать ваша «команда», что возвращает вызов «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!");
}
});