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街,城市,邮政编码