将函数作为参数传递给方法并在Java中返回其返回值?

时间:2019-05-07 10:30:42

标签: java generics

我的情况如下,我有一堆命令,例如:

someService1.foo()
someService2.bar()

需要以两种不同的方式执行,一种是在修改后的安全上下文中执行的,有些时候是在不修改安全上下文的情况下执行的。现在我的计划是编写一个Executor,其结构应如下所示:

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

我的主要问题是如何将命令的返回值返回给调用方法。因为Runnable的run()的返回类型为void。所以我考虑过使用Callable来实现这一目标。但是,是否有解决此问题的通用方法?

1 个答案:

答案 0 :(得分:1)

好吧,您可以创建自己的接口(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();
 }
}