将if-else转换为lambda表达式

时间:2016-08-17 13:10:25

标签: java lambda java-8

我试图将一个简单的if-else语句转换为一个更优雅的lambda表达式。但是我很难找到我所读过的解决方案。

简单的陈述如下:

if (status.getStatus() == 'A') then
  handleA();
else if (status.getStatus() == 'B') then
  handleB();
else
  handleEverythingElse();

我知道我可以将Command模式与地图一起使用,但我确信我缺少一些Java 8的优雅。有人能告诉我界面& impl,以及它在代码正文中的用法(我通过示例学习)?

非常感谢任何帮助!

2 个答案:

答案 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;
  }
}

我希望这有道理......