我有一系列方法需要按顺序运行,使用每个方法的结果作为下一个方法的参数。但是,在调用下一个方法之前,我还会检查每个方法的结果是否“好”(如果它是“坏”,那么我会提前退出该方法。如果不是,这些方法返回一个空的 Optional
成功。
我可以执行重构来改进代码吗? 责任链感觉有点过火了。
private boolean isSequenceSuccessful() {
Optional<byte[]> result1 = doSomething();
if (!result1.isPresent()) {
return false;
}
Optional<byte[]> result2 = doAnotherThing(result1.get());
if (!result2.isPresent()) {
return false;
}
Optional<byte[]> result3 = doSomethingElse(result2.get());
if (!result3.isPresent()) {
return false;
}
return doMoreStuff(result3.get());
}
我不想使用异常来控制方法的流程,因为那是一种代码味道(我希望有时会得到“坏”结果)。
最佳答案
您可以使用 Optional
将其写得更短和映射:
private boolean isSequenceSuccessful() {
return Optional.of(doSomething())
.flatMap(result1 -> doAnotherThing(result1))
.flatMap(result2 -> doSomethingElse(result2))
.map(result3 -> doMoreStuff(result3))
.orElse(false);
}
或者使用更短的方法引用:
private boolean isSequenceSuccessful2() {
return Optional.of(doSomething())
.flatMap(this::doAnotherThing)
.flatMap(this::doSomethingElse)
.map(this::doMoreStuff)
.orElse(false);
}
这取决于你喜欢什么。如果您想保留中间结果变量,请使用 lambda 版本。
自方法doAnotherThing
和 doSomethingElse
返回 Optional<byte[]>
, Optional.flatMap
需要继续映射。否则,您可以更改这些方法的返回类型以返回 byte[]
独自。然后你会使用 Optinal.map
只有,这会更一致。
只有在 Optional
中存在值时才会执行映射.如果可以应用所有映射,则最后一个值作为结果返回。否则处理将很快失败并绕过所有剩余的映射到最后一条语句 orElse
并返回它的值(value)。这是 false
根据您的代码。
关于java - 重构一系列方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51635143/