是否有一个对象能够链接连续的方法调用
Is there an object able to chain successive method calls
我有几个具有以下模式的方法:
int status = method0();
if(status = success){
status = method1();
}
if(status = success){
status = method2();
}
if(status = success){
status = method3();
}
if(status = success){
status = method4();
}
return status
我想让它更具可读性。我想象这样的事情:
final CommandPipe pipe = new CommandPipe();
status = pipe.next(() -> method0(arg0))
.next(() -> method1(arg1))
.next(() -> method2(arg2))
.next(() -> method3(arg3))
.next(() -> method4(arg4))
.getResult();
return status;
在 Java 8 中是否有对象在执行此操作?
目前没有。
因为你的商业案例框架不会提供这样的东西。
你必须自己构造,否则你可以使用 CompletableFuture.supplyAsync 和 thenApply 方法连续使用以更好地利用线程资源。
使用 List<IntSupplier>
和 for 循环:
int method(List<IntSupplier> list) {
int status = success;
for (Iterator<IntSupplier> it = list.iterator(); status == success && it.hasNext();) {
status = it.next().get();
}
return status;
}
像这样调用:
int status = method(List.of(
() -> method0(arg0),
() -> method1(arg1) /* etc */));
(当然,List.of 是一种 Java 9 方法。随心所欲地构建列表)。
你的 CommandPipe
class 会很容易写:
class CommandPipe {
int status = success;
CommandPipe next(IntSupplier supplier) {
if (status == success) {
status = supplier.get();
}
return this;
}
int getResult() { return status; }
}
像你在问题中写的那样调用。
我觉得最简单的就是自己实现这样的类型,比如:
public class CommandPipe<T> {
private Predicate<T> predicate;
private T lastResult = null;
private boolean firstInvotion = true;
public CommandPipe(Predicate<T> predicate) {
this.predicate = predicate;
}
public CommandPipe next(Supplier<T> supplier) {
boolean doStep;
if (firstInvotion) {
firstInvotion = false;
doStep = true;
} else {
doStep = predicate.test(lastResult);
}
if (doStep) {
lastResult = supplier.get();
} else {
// error handling
}
return this;
}
public T getResult() {
return lastResult;
}
}
您可以像这样使用可变参数定义静态方法。
public static int pipe(IntSupplier... methods) {
int success = 0;
int status = success;
for (IntSupplier m : methods) {
status = m.getAsInt();
if (status != success)
break;
}
return status;
}
和
int status = pipe(
() -> method0(arg0),
() -> method1(arg0),
() -> method2(arg0),
() -> method3(arg0),
() -> method4(arg0));
我有几个具有以下模式的方法:
int status = method0();
if(status = success){
status = method1();
}
if(status = success){
status = method2();
}
if(status = success){
status = method3();
}
if(status = success){
status = method4();
}
return status
我想让它更具可读性。我想象这样的事情:
final CommandPipe pipe = new CommandPipe();
status = pipe.next(() -> method0(arg0))
.next(() -> method1(arg1))
.next(() -> method2(arg2))
.next(() -> method3(arg3))
.next(() -> method4(arg4))
.getResult();
return status;
在 Java 8 中是否有对象在执行此操作?
目前没有。 因为你的商业案例框架不会提供这样的东西。 你必须自己构造,否则你可以使用 CompletableFuture.supplyAsync 和 thenApply 方法连续使用以更好地利用线程资源。
使用 List<IntSupplier>
和 for 循环:
int method(List<IntSupplier> list) {
int status = success;
for (Iterator<IntSupplier> it = list.iterator(); status == success && it.hasNext();) {
status = it.next().get();
}
return status;
}
像这样调用:
int status = method(List.of(
() -> method0(arg0),
() -> method1(arg1) /* etc */));
(当然,List.of 是一种 Java 9 方法。随心所欲地构建列表)。
你的 CommandPipe
class 会很容易写:
class CommandPipe {
int status = success;
CommandPipe next(IntSupplier supplier) {
if (status == success) {
status = supplier.get();
}
return this;
}
int getResult() { return status; }
}
像你在问题中写的那样调用。
我觉得最简单的就是自己实现这样的类型,比如:
public class CommandPipe<T> {
private Predicate<T> predicate;
private T lastResult = null;
private boolean firstInvotion = true;
public CommandPipe(Predicate<T> predicate) {
this.predicate = predicate;
}
public CommandPipe next(Supplier<T> supplier) {
boolean doStep;
if (firstInvotion) {
firstInvotion = false;
doStep = true;
} else {
doStep = predicate.test(lastResult);
}
if (doStep) {
lastResult = supplier.get();
} else {
// error handling
}
return this;
}
public T getResult() {
return lastResult;
}
}
您可以像这样使用可变参数定义静态方法。
public static int pipe(IntSupplier... methods) {
int success = 0;
int status = success;
for (IntSupplier m : methods) {
status = m.getAsInt();
if (status != success)
break;
}
return status;
}
和
int status = pipe(
() -> method0(arg0),
() -> method1(arg0),
() -> method2(arg0),
() -> method3(arg0),
() -> method4(arg0));