java - 重构一系列方法

标签 java java-8 refactoring option-type

我有一系列方法需要按顺序运行,使用每个方法的结果作为下一个方法的参数。但是,在调用下一个方法之前,我还会检查每个方法的结果是否“好”(如果它是“坏”,那么我会提前退出该方法。如果不是,这些方法返回一个空的 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 版本。

自方法doAnotherThingdoSomethingElse返回 Optional<byte[]> , Optional.flatMap需要继续映射。否则,您可以更改这些方法的返回类型以返回 byte[]独自。然后你会使用 Optinal.map只有,这会更一致。

只有在 Optional 中存在值时才会执行映射.如果可以应用所有映射,则最后一个值作为结果返回。否则处理将很快失败并绕过所有剩余的映射到最后一条语句 orElse并返回它的值(value)。这是 false根据您的代码。

关于java - 重构一系列方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51635143/

相关文章:

c# - 删除过度热心的 try..catch block 的破坏性最小的方法是什么?

java - 具有依赖项的项目的 Eclipse 重命名功能

c# - 有没有办法以编程方式将类从一个 namespace 移动到另一个 namespace ?

java - Maven 命令行选项有哪些?

java - 不了解顶点着色器转换

java - 无状态 EJB : Finding the balance between performance and security

java - 1 个核心上的并行 Java 流

date - 如何获取经期的开始和结束时间?

java - 为 Java 7 使用快速且恒定的 get() 进行映射

java - Spring 应用程序上的最大 session 数,而不是应用程序上用户的最大 session 数