我试图将一个简单的if-else语句转换为一个更优雅的lambda表达式。但是我很难找到我所读过的解决方案。
简单的陈述如下:
if (status.getStatus() == 'A') then
handleA();
else if (status.getStatus() == 'B') then
handleB();
else
handleEverythingElse();
我知道我可以将Command模式与地图一起使用,但我确信我缺少一些Java 8的优雅。有人能告诉我界面& impl,以及它在代码正文中的用法(我通过示例学习)?
非常感谢任何帮助!
答案 0 :(得分:2)
如果/ else或甚至开关不是“好的OO设计”答案。 lambda也不是。从某个地方检索状态,然后根据它做出决定 - 这是程序编程;不是OO。
你看,你面前的实际情况是一个状态机。你有不同的状态;重点是:如果你的“事物”处于A状态;然后你想做某事(调用handleA())。如果你在B州;你也想做某事(比如调用handleB())。
所以,你实际拥有的是:
abstract class State {
abstract void doIt();
...
StateA extends State {
@Override
void doIt() { handleA(); }
因此,从客户端,您只需在类State的同一对象上调用doIt()。
因此:如果您真的对改进代码库感兴趣,请学习如何使用多态来摆脱if / else / switch语句。
您可以观看此video以了解我在说什么。
答案 1 :(得分:0)
也许我没有完全解释我的问题,但我的同事提出了另一种我非常喜欢的解决方案。他建议我将if-else块设为java.util.Supplier,并在我需要它的Entity类中调用它。
所以我的代码从这个逻辑块散落到各处:
public class ServiceImpl {
...
if (entity.getStatus) == 'A' then
finalStatus = handleA();
else if (entity.getStatus() == 'B') then
finalStatus = handleB();
else
finalStatus = handleEverythingElse();
...
}
对于这个很好的压缩形式:
public class ServiceImpl {
finalStatus = entity.getFinalStatus(this::handleStatus);
public int handleStatus() {
return dao.getStatus();
}
}
在我的Entity类中实现:
public class Entity {
public int handleStatus(Supplier<Integer> s) {
int finalStatus;
if (status) == 'A' then
finalStatus = handleA();
else if (status() == 'B') then
finalStatus = handleB();
else
finalStatus = supplier.get();
return status;
}
}
我希望这有道理......