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

我有以下代码


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。有什么建议么?


蓝山帝景
浏览 152回答 4
4回答

尚方宝剑之说

您可以使用默认值,例如空String:private static final String DEFAULT_FIELD = ""; Optional.ofNullable(addresses.getAddrCivicNo()).orElse(DEFAULT_FIELD)?:尽管如果不需要可空值的映射,则检查 null 然后解析(可能使用运算符)会更干净。

潇湘沐

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

皈依舞

您还可以尝试标准化这些值。我不认为Optional这里的“monad”提供任何价值。像这样的东西应该有效(仅适用于String值):public static String nullToEmpty(final String str) {&nbsp; return (null == str) ? "" : str;}// ...nullToEmpty(addresses.getAddrCivicNo());

慕村225694

使用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());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java