Передать функцию в качестве параметра в метод и вернуть его возвращаемое значение в Java? - PullRequest
0 голосов
/ 07 мая 2019

Моя ситуация такова, у меня есть куча команд, например ::1001

someService1.foo()
someService2.bar()

Которые необходимо выполнить двумя различными способами: один в измененном контексте безопасности, а иногда без изменения контекста безопасности. Теперь я планировал написать Executor, который должен иметь такую ​​структуру:

public Object runCommand(Runnable command){
  if(someCondition){
    //run command in modified context
  } else {
    //just run the command
  }
}

Моя главная проблема заключается в том, как вернуть возвращаемое значение команды вызывающему методу. Потому что run () Runnable имеет тип возврата void. Поэтому я подумал об использовании Callable для достижения этой цели. Но есть ли чистый общий подход к этой проблеме?

1 Ответ

1 голос
/ 07 мая 2019

Что ж, вместо использования Runnable вы можете создать свой собственный интерфейс (Runnable также является интерфейсом).Если вы хотите, чтобы возвращаемый тип был универсальным, вы можете создать что-то вроде:

@FunctionalInterface
interface MyCommand<T> {
    public T execute();
}

Тогда ваш код станет:

public <T> T runCommand(MyCommand<T> command){
  if(someCondition){
    //Run it in context or whatever 
    return command.execute();
  } else {
    return command.execute();
  }
}

И вы можете использовать его как (полный код здесь):

public class Test{

 public static void main(String[] args) {
    Test test=new Test();
    String result1=test.runCommand(test::stringCommand);
    Integer result2=test.runCommand(test::integerCommand);
    Boolean result3 = inter.runCommand(new MyCommand<Boolean>() {
        @Override
        public Boolean execute() {
            return true;
        }
    });
 }

 public String stringCommand() {
    return "A string command";
 }

 public Integer integerCommand() {
    return new Integer(5);
 }

 public <T>T runCommand(MyCommand<T> command){
    return command.execute();
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...