如何解决由于可选对象的属性也是可选的,如何优化 if-else 语句?
我有一个名为 Form 的可选对象。这还有 3 个其他可选属性。原因是,如果此表单对象不存在,我必须生成自己的表单数据。如果表单存在,用户仍然可以选择将他们的属性留空,在这种情况下需要我的方法来生成它们。我实现这个逻辑的方式如下。
private FormSection buildForm(final Optional<Form> formOptional) {
Set<String> formNames = null;
Set<Question> formTypes = null;
Set<Question> formDetails = null;
if (formOptional.isPresent()) {
Form form = formOptional.get();
formNames = formSection.names()
.orElseGet(() -> getNamesFromDB());
formTypes = formSection.formTypes()
.orElseGet(() -> getFormTypesFromDB());
formDetails = formSection.formDetails()
.orElseGet(() -> getFormDetailsFromDB());
} else {
formNames = getNamesFromDB();
formTypes = getFormTypesFromDB();
formDetails = getFormDetailsFromDB();
}
return Form()
.names(formNames)
.formTypes(formTypes)
.formDetails(formDetails)
.build();
}
我觉得我正在重做一些检查,并且可以优化整个 if-else 语句。顺便说一下,我使用的是 Java 8。
解决方法
制作一个完全空白的表单实现。然后强烈地重新考虑您的 API; Optional
是在编写流终端时返回的适当内容。为方法返回它们是可以的(但不是惯用的)。在其他任何地方(例如字段或作为参数类型)使用它们几乎被普遍认为是“错误的”;参见例如 this top answer(Brian Goetz 是 oracle 的 Lambdas 团队负责人)告诉您不要这样做。
避免空值的首选解决方案是尽可能使用合理的默认值。并非所有对象类型都具有这些(并且不要强制它),但是鉴于您有一个包含 100% 可选数据的表单,这里是合适的:“空”表单(或非存在可选,如果您愿意),以及存在/非空表单,其中表单包含的每一件事都是空/不存在?
我不认为你打算有区别。在这种情况下 - 太好了。抛弃可选形式。采用默认形式。然后,您可以将“默认表单”(所有“字段”都不存在的表单)传递给此方法:
class Form {
public static final Form BLANK_FORM = ....;
}
private FormSection buildForm(Form form) {
}
并调整当前以 Optional<Form>
结尾的任何代码,改为返回空白表单。例如,而不是:
Optional<Form> formOptional = Optional.ofNullable(x);
使用:
Form form = x == null ? Form.BLANK_FORM : x;
或者如果您有:
if (....) {
return Optional.empty();
} else {
// fetch all sorts of details.
Form f = new Form(...);
return Optional.of(f);
}
分别用 return Form.BLANK_FORM;
和 return f;
替换这些 return 语句。你明白了:)
您可以使用 flatMap
中的 Optional
方法来“链接”返回另一个 Optional
的操作
formNames = form.flatMap(Form::names).orElseGet(() -> getNamesFromDB());
flatMap
仅在 form
不为空时应用,否则返回空可选。如果存在,则由 names()
中的 Form
方法返回的可选值替换。
private FormSection buildForm(final Optional<Form> opForm) {
Set<String> formNames = opForm.flatMap(Form::names).orElseGet(() -> getNamesFromDB());
Set<Question> formTypes = opForm.flatMap(Form::formTypes).orElseGet(() -> getFormTypesFromDB());
Set<Question> formDetails = opForm.flatMap(Form::formDetails).orElseGet(() -> getFormDetailsFromDB());
return Form()
.names(formNames)
.formTypes(formTypes)
.formDetails(formDetails)
.build();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。