带有varargs的Java方法,该方法执行操作并打印已知结果
在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)
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"));