【问题标题】:Avoid isPresent() and get() in control logic避免在控制逻辑中使用 isPresent() 和 get()
【发布时间】:2015-08-31 20:36:26
【问题描述】:

在 Java 8 中是否有更漂亮的方法来执行以下操作,避免使用 isPresentget

void doStuff(String someValue, Optional<Boolean> doIt) {
    if (doIt.isPresent()) {
        if (doIt.get()) {
            trueMethod(someValue);
        } else {
            falseMethod(someValue);
        }
    }
}

我尝试使用map,但没有成功。但我可能还不够努力?

【问题讨论】:

  • 使用Optional作为方法参数可能不是一个好的设计。请参阅 OpenJDK 开发人员的 this answer
  • 我同意@Tagir Valeev。我希望,因为当doIt 为空时这个函数什么都不做,你给了我们一个过于简化的函数版本。最好的选择可能是提供覆盖。

标签: java lambda functional-programming java-8 optional


【解决方案1】:

这将是使用map 的函数式方法:

Function<Boolean, Void> logic = isTrue -> {
  if (isTrue) trueMethod(someValue);
  else falseMethod(someValue);
  return null;
};
doIt.map(logic);

然而,它真的很丑,主要是因为你的“不是很实用”trueMethod/falseMethod,它们都返回void(导致丑陋的return null )。

【讨论】:

    【解决方案2】:

    您可以使用ifPresent 代替isPresentget

    void doStuff(String someValue, Optional<Boolean> doIt) {
        doIt.ifPresent (b -> {
                                 if (b) 
                                     trueMethod(someValue);  
                                 else
                                     falseMethod(someValue);
                             });
    }
    

    编辑:修复了我的代码,因为如果 trueMethodfalseMethod 不返回任何内容,您将无法使用三元运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2016-03-18
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多