我有以下代码
private static String getAddressLine(Addresses addresses) {
if (addresses.getAddrCivicNo() == null || addresses.getStName() == null)
{
return null;
}
StringBuilder addressLine = new StringBuilder("");
addressLine.append(Optional.ofNullable(addresses.getAddrCivicNo()).get());
addressLine.append(" ");
addressLine.append(Optional.ofNullable(addresses.getAddrPreStrTypeDesignator()).get());
addressLine.append(" ");
addressLine.append(Optional.ofNullable(addresses.getStName()).get());
addressLine.append(", ");
addressLine.append(Optional.ofNullable(addresses.getAddrPostStrTypeDesignator()).get());
addressLine.append(" ");
addressLine.append(Optional.ofNullable(addresses.getAddrPostStrDirectionDesignator()).get());
addressLine.append(" ");
addressLine.append(Optional.ofNullable(addresses.getAddrPreStrDirectionDesignator()).get());
addressLine.append(" ");
addressLine.append(Optional.of(addresses.getAddrUnitDesignatorTypeCd()).get());
addressLine.append(" ");
addressLine.append(Optional.of(addresses.getAddrUnitNo()).get());
return addressLine.toString();
}
如果我的任何字段为null
,由于进行了NoSuchElementException
调用,我收到一个get()
错误。如果我删除了get()
调用,我将附加Optional.empty
,但是如果该字段为null
,我将不附加任何内容。有什么建议吗?
答案 0 :(得分:4)
您可以使用默认值,例如空的String
:
private static final String DEFAULT_FIELD = "";
Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)
如果不需要映射可空值,则先检查空值然后解析(可能使用?:
运算符)会更干净。
答案 1 :(得分:1)
如果您使用的是JDK9 +,我建议您调查Objects.requireNonNullElse,即:
public static <T> T requireNonNullElse(T obj,T defaultObj)
与进行Optional.ofNullable(addresses.getAddrCivicNo()).orElse(...)
等操作相比,它更清洁,更易读。使用前者也更性能友好,因为您无需创建可选实例。
此外,一些可能可能简化您逻辑的想法。
您可以使用Stream.of
,然后过滤掉空值,然后使用指定的分隔符加入。
Stream.of(addresses.getAddrCivicNo(), addresses.getAddrPreStrTypeDesignator(), ...)
.filter(Objects::nonNull)
.collect(joining(" "));
我建议您考虑的另一项建议可能是使函数getAddressLine
返回Optional<String>
而不是String
。这实质上使该API的客户端不必处理 nullity ,而是为他们提供了可选的API来操作,该API提供了几种有用的方法来安全地解开Optional。
答案 2 :(得分:0)
您也可以尝试将这些值标准化。我认为这里的Optional
“单子”没有提供任何价值。
类似的事情应该起作用(仅适用于String
值):
public static String nullToEmpty(final String str) {
return (null == str) ? "" : str;
}
// ...
nullToEmpty(addresses.getAddrCivicNo());
答案 3 :(得分:0)
使用Objects.toString方法,该方法采用“如果第一个参数为null时使用”参数:
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());