Java 如何在避免NoTouchElementException错误的同时获取可选值?
我有以下代码Java 如何在避免NoTouchElementException错误的同时获取可选值?,java,string,java-8,java-stream,optional,Java,String,Java 8,Java Stream,Optional,我有以下代码 private static String getAddressLine(Addresses addresses) { if (addresses.getAddrCivicNo() == null || addresses.getStName() == null) { return null; } StringBuilder addressLine = new StringBuilder(""); addressLine.app
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
,由于调用get()
,我会得到一个NoTouchElementException
错误。如果我删除get()
调用,我将追加可选。空
,但如果字段为null
,我将不追加任何内容。有什么建议吗?您可以使用默认值,例如空的字符串
:
private static final String DEFAULT_FIELD = "";
Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)
尽管如果不需要空值的映射,检查空值然后解析(可能使用
?:
运算符)会更干净。您可以使用默认值,例如空的字符串
:
private static final String DEFAULT_FIELD = "";
Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)
尽管如果不需要空值的映射,检查空值然后解析(可能使用
?:
运算符)会更干净。您也可以尝试规范化这些值。我认为这里的可选的“monad”没有提供任何价值
类似的方法应该可以工作(仅适用于String
值):
公共静态字符串nullToEmpty(最终字符串str){
返回(null==str)?“”:str;
}
// ...
nullToEmpty(addresses.getAddrCivicNo());
您还可以尝试将这些值标准化。我认为这里的可选的“monad”没有提供任何价值
类似的方法应该可以工作(仅适用于String
值):
公共静态字符串nullToEmpty(最终字符串str){
返回(null==str)?“”:str;
}
// ...
nullToEmpty(addresses.getAddrCivicNo());
使用该方法,该方法采用“第一个参数为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());
使用该方法,该方法采用“第一个参数为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());
如果您在JDK9+上,我建议您调查一下,即:
我建议您考虑的另一个建议可能具有函数<代码> GADADESRESLION>代码>返回<代码>可选<代码>,而不是<代码>字符串< /代码>。这本质上使此API的客户端不必处理空值,而是提供可选API供其操作,该API提供了几种有用的方法来安全地打开可选API。
如果您使用的是JDK9+,我建议您研究一下,即:
我建议您考虑的另一个建议可能具有函数<代码> GADADESRESLION>代码>返回<代码>可选<代码>,而不是<代码>字符串< /代码>。这本质上使此API的客户端不必处理空值,而是为它们提供了可选的API来操作,该API提供了几种有用的方法来安全地展开可选API。
您为什么要使用optional
?这些值被包装成一个可选的
,然后立即再次解包。这样做有什么意义?你为什么还要使用可选的?这些值被包装成一个可选的
,然后立即再次解包。这样做有什么意义?谢谢大家的帮助。一些非常有趣的解决方案。谢谢大家的帮助。一些非常有趣的解决方案。不幸的是,我们仍然使用Java8。我真的很喜欢你使用的流,非常干净,但我的问题是,我的一些字段用空格分隔,而其他字段用逗号分隔。基本上,我正在构建一个地址,所以它看起来像1234街,城市,邮政编码。不幸的是,我们仍然使用Java8。我真的很喜欢你使用的流,非常干净,但我的问题是,我的一些字段用空格分隔,而其他字段用逗号分隔。基本上,我正在建立一个地址,所以它看起来像1234街,城市,邮政编码