4 回答
TA贡献1788条经验 获得超4个赞
您可以使用默认值,例如空String
:
private static final String DEFAULT_FIELD = ""; Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)
?:
尽管如果不需要可空值的映射,则检查 null 然后解析(可能使用运算符)会更干净。
TA贡献1816条经验 获得超6个赞
如果您使用的是 JDK9+,我建议您研究一下Objects.requireNonNullElse,即:
public static <T> T requireNonNullElse(T obj,T defaultObj)
这比做Optional.ofNullable(addresses.getAddrCivicNo()).orElse(...)
etc 更干净、更具可读性。使用前者也更加性能友好,因为您不需要创建可选实例。
此外,一些想法可能会简化您的逻辑。
您可以使用Stream.of
然后过滤掉空值,然后使用指定的分隔符连接。
Stream.of(addresses.getAddrCivicNo(), addresses.getAddrPreStrTypeDesignator(), ...) .filter(Objects::nonNull) .collect(joining(" "));
我建议您考虑的另一个建议是可能让函数getAddressLine
返回 aOptional<String>
而不是String
。这本质上使该 API 的客户端不必处理nullity,而是为他们提供了可操作的可选 API,该 API 提供了多种有用的方法来安全地解开可选值。
TA贡献1851条经验 获得超3个赞
您还可以尝试标准化这些值。我不认为Optional这里的“monad”提供任何价值。
像这样的东西应该有效(仅适用于String值):
public static String nullToEmpty(final String str) {
return (null == str) ? "" : str;
}
// ...
nullToEmpty(addresses.getAddrCivicNo());
TA贡献1880条经验 获得超4个赞
使用Objects.toString方法,该方法采用“如果第一个参数为空则使用”参数:
addressLine.append(Objects.toString(addresses.getAddrCivicNo(), ""));
addressLine.append(" ");
addressLine.append(Objects.toString(addresses.getAddrPreStrTypeDesignator(), ""));
addressLine.append(" ");
addressLine.append(Objects.toString(addresses.getStName(), ""));
addressLine.append(", ");
addressLine.append(Objects.toString(addresses.getAddrPostStrTypeDesignator(), ""));
addressLine.append(" ");
addressLine.append(Objects.toString(addresses.getAddrPostStrDirectionDesignator(), ""));
addressLine.append(" ");
addressLine.append(Objects.toString(addresses.getAddrPreStrDirectionDesignator(), ""));
addressLine.append(" ");
addressLine.append(addresses.getAddrUnitDesignatorTypeCd());
addressLine.append(" ");
addressLine.append(addresses.getAddrUnitNo());
添加回答
举报