簡體   English   中英

嵌套Optional.map的優美替代方案?

[英]Graceful alternative to nested Optional.map?

我有多個Optional必須映射到POJO。 有沒有比以下更好的選擇了?

class SimplePojo {
    private String stringField;
    private Integer integerField;
    // All args. constructor, getter, setter
}

Optional<String> stringOptional = ...
Optional<Integer> integerOptional = ...
Optional<SimplePojo> simplePojoOptional = stringOptional.flatMap(
    string -> integerOptional.map(integer -> new SimplePojo(string, integer)))

在上面的示例中,為了簡化起見,我將問題簡化為2個Optionals。 但是我實際上有3個Optionals,還有更多選擇。 恐怕最后一行很快就會變得笨拙。

請注意:不能使用Vavr或Functional Java之類的功能框架。

使用Builder怎么樣?

class SimplePojo {

  public static class Builder {
    private String stringField;

    public Builder withStringField(String str) {
      this.stringField = str;
      return this;
    }
    // and other "with" methods...


    public Optional<SimplePojo> build() {
      if (stringField == null || anotherField == null /* and so forth */) {
        return Optional.empty();
      } else {
        return Optional.of(new SimplePojo(this));
      }
    }
  }
  private final String stringField;

  /* private constructor, so client code has to go through the Builder */
  private SimplePojo(Builder builder) {
    this.stringField = builder.stringField;
    // etc.
  }
}

然后,您可以按以下方式使用它:

SimplePojo.Builder builder = new SimplePojo.builder();
optionalStringField.ifPresent(builder::withStringField);
// etc.
return builder.build();

在這里以這種方式追求功能風格沒有任何優勢。 查看三個選項:

一個:如果可以更改SimplePojo類,並且這種情況很常見,則可以考慮向SimplePojo添加一個工廠方法:

class SimplePojo {
  public static Optional<SimplePojo> of(final Optional<String> stringField, final Optional<Integer> integerField) {
    if (stringField.isPresent() && integerField.isPresent()) {
      return new SimplePojo(stringField.get(), integerField.get());
    else
      return Optional.empty();
  }
}

二:如果您不能更改SimplePojo ,則可能要在其他地方將其創建為實用程序方法。 如果僅在一個類中需要此模式,請在該類中將方法設為私有!

第三:如果您只需要執行一次或兩次,那么我寧願從第一個選項開始使用if...then結構,而不是為了便於閱讀而使用的功能符號:

final Optional<SimplePojo> simplePojoOptional;
if (stringField.isPresent() && integerField.isPresent()) {
  simplePojoOptional = new SimplePojo(stringField.get(), integerField.get());
else
  simplePojoOptional = Optional.empty();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM