为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取可选值,同时避免 NoSuchElementException 错误?

如何获取可选值,同时避免 NoSuchElementException 错误?

蓝山帝景 2023-08-04 10:10:26
我有以下代码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。有什么建议么?
查看完整描述

4 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您可以使用默认值,例如空String

private static final String DEFAULT_FIELD = "";

Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)

?:尽管如果不需要可空值的映射,则检查 null 然后解析(可能使用运算符)会更干净。


查看完整回答
反对 回复 2023-08-04
?
潇湘沐

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 提供了多种有用的方法来安全地解开可选值。


查看完整回答
反对 回复 2023-08-04
?
皈依舞

TA贡献1851条经验 获得超3个赞

您还可以尝试标准化这些值。我不认为Optional这里的“monad”提供任何价值。


像这样的东西应该有效(仅适用于String值):


public static String nullToEmpty(final String str) {

  return (null == str) ? "" : str;

}


// ...


nullToEmpty(addresses.getAddrCivicNo());


查看完整回答
反对 回复 2023-08-04
?
慕村225694

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());


查看完整回答
反对 回复 2023-08-04
  • 4 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信