Java 嵌套可选.map的优雅替代方案?
我有多个必须映射到POJO的选项。有没有比下面更好的选择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 = ..
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();