根据可选值调用void方法时如何使用Optional的map和orElseGet方法

How to use Optional's map and orElseGet methods when calling a void method based on the optional value

我有一个 Java 可选变量,我正在使用如下。

Optional<Forms> formsOptional = input.data().get().forms();
if(formsOptional.isPresent()) {
    this.doSomething(myValue, forms.get());
} else {
    this.doSomething(myValue, Forms.builder().names(myList).build());
}

在这种情况下,doSomething 方法是一个做某事的 void 方法。由于这是一个 void 方法,我对如何使用 map().orElseGet() 感到困惑,因为我也没有任何要转换的东西。任何使用任何 Java8 可选技术优化这段代码的建议都将不胜感激。

您已经拥有 java-8 version, but if you are using java-9 或更高的最佳版本,您可以使用 ifPresentOrElse

formsOptional.ifPresentOrElse(val -> doSomething(myValue, val),
                 () -> doSomething(myValue, Forms.builder().names(myList).build()));

使用 orElseGet(other),因此如果该值存在,则构建器表达式不会被执行。

Optional<Forms> formsOptional = input.data().get().forms();

Forms forms = formsOptional.orElseGet(() -> Forms.builder().names(myList).build());

this.doSomething(myValue, forms);

您通常会将其作为先前方法链的一部分来执行,您可以将其拆分为多行,以便在需要时进行说明:

Forms forms = input.data()
                   .get()
                   .forms()
                   .orElseGet(() -> Forms.builder().names(myList).build());

this.doSomething(myValue, forms);