带有varargs的Java方法,该方法执行操作并打印已知结果

带有varargs的Java方法,该方法执行操作并打印已知结果,java,java-8,variadic-functions,Java,Java 8,Variadic Functions,在Java中是否可以创建类似于此执行方法的方法: public void execute(Runnable... mrs) { for (Runnable mr : mrs) { mr.run(); // should print some expected string here } } public void sleep(int seconds) { try { Thread.sleep(1000 * seconds)

在Java中是否可以创建类似于此执行方法的方法:

public void execute(Runnable... mrs) {
    for (Runnable mr : mrs) {
        mr.run();
        // should print some expected string here
    }
}

public void sleep(int seconds) {
    try {
        Thread.sleep(1000 * seconds);
    } catch (InterruptedException ex) {
        log.error("Error occured", ex);
    }
}

public void customExecute() {
    execute(() -> sleep(1), () -> sleep(2));
}
但在执行每个操作后,它应该打印传递的字符串参数,并且(问题的关键时刻)它应该支持一行用法-类似于:

execute(("Action 1 passed") -> someAction(), ("Other action passed") -> otherAction());

Java没有将键值对传递给方法的特殊语法。我看到两种可能的解决办法

1.创建附加对象: 面向对象,但不是很短

2.使用不同数量的参数声明几个
execute
方法。
这里的调用看起来更简洁,但它需要更多的“库”代码。

您可以使用不同的生成器模式来实现:

public interface Step {
    void doIt(String msg, Runnable r);
    default Step then(String msg, Runnable r) {
        doIt(msg, r);
        return this;
    }
}
public static Step execute(String msg, Runnable r) {
    Step s=(m,x)-> {
        x.run();
        System.out.println(msg);
    };
    return s.then(msg, r);
}
然后你可以像这样使用它

execute("Action 1 passed", () -> someAction())
  .then("Other action passed", () -> otherAction());
并根据您的喜好进行扩展

execute("Action 1 passed", () -> someAction())
  .then("Other action passed", () -> otherAction())
  .then("NextAction passed", () -> nextAction())
  .then("and nextAction passed again", () -> nextAction()) ;
它也很容易适应其他执行策略,例如

static ExecutorService es=Executors.newSingleThreadExecutor();
public static Step executeInBackground(String msg, Runnable r) {
    Step s=(m,x)-> es.execute(()-> execute(m, x));
    return s.then(msg, r);
}
只需在调用者处进行微小更改即可使用:

executeInBackground("Action 1 passed", () -> someAction())
  .then("Other action passed", () -> otherAction())
  .then("NextAction passed", () -> nextAction())
  .then("and nextAction passed again", () -> nextAction());

这是一个使用varargs和高阶函数的变体。它比霍尔格的更简单(但也不那么普遍)。但是,如果您只想在执行
Runnable
之后打印字符串,这可能就足够了

其思想是使用一个函数创建一个新的
Runnable
,方法是获取一个现有函数并在运行后打印一个字符串:

static Runnable runPrint(Runnable r, String msg) {
    return () -> {
        r.run();
        System.out.println(msg);
    };
}
然后,您只需将其中几个传递给基于varargs的
execute
方法:

    execute(runPrint(() -> sleep(1), "first"),
            runPrint(() -> sleep(2), "second"),
            runPrint(() -> sleep(3), "third"));

您需要并行执行还是顺序执行?而且,
InterruptedException
并不意味着错误。@Sasha依次说。在我的例子中,在执行每个操作之后,都有一些很长的操作,我想在控制台中打印一些东西。
static Runnable runPrint(Runnable r, String msg) {
    return () -> {
        r.run();
        System.out.println(msg);
    };
}
    execute(runPrint(() -> sleep(1), "first"),
            runPrint(() -> sleep(2), "second"),
            runPrint(() -> sleep(3), "third"));