Java 嵌套可选.map的优雅替代方案?

Java 嵌套可选.map的优雅替代方案?,java,optional,Java,Optional,我有多个必须映射到POJO的选项。有没有比下面更好的选择 class SimplePojo { private String stringField; private Integer integerField; // All args. constructor, getter, setter } Optional<String> stringOptional = ... Optional<Integer> integerOptional = ..

我有多个必须映射到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)))
类SimplePojo{ 私有字符串字符串字段; 私有整数整型域; //所有参数。构造函数、getter、setter } 可选字符串可选=。。。 可选整数可选=。。。 可选simplePojoOptional=stringOptional.flatMap( string->integerOptional.map(integer->newsimplepojo(string,integer))) 在上面的例子中,我将问题简化为2个选项,以保持简短。但我实际上有3个选项,还有更多的选项。恐怕最后一行很快就会变得很难用了


请注意:使用Vavr或functional Java等功能性框架不是我的选择。

使用
生成器如何

类SimplePojo{ 公共静态类生成器{ 私有字符串字符串字段; 带字符串字段的公共生成器(字符串str){ this.stringField=str; 归还这个; } //和其他“使用”方法。。。 公共可选生成(){ if(stringField==null | |另一个field==null/*等等*/){ 返回可选的.empty(); }否则{ 返回可选的.of(新的SimplePojo(this)); } } } 私有最终字符串字符串字段; /*私有构造函数,因此客户端代码必须经过生成器*/ 私人SimplePojo(建筑商){ this.stringField=builder.stringField; //等等。 } }
然后您可以按如下方式使用它:

SimplePojo.Builder=new SimplePojo.Builder();
optionalStringField.ifPresent(生成器::withStringField);
//等等。
返回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();
  }
}
final Optional<SimplePojo> simplePojoOptional;
if (stringField.isPresent() && integerField.isPresent()) {
  simplePojoOptional = new SimplePojo(stringField.get(), integerField.get());
else
  simplePojoOptional = Optional.empty();