Java api返回Optional

问题描述 投票:0回答:3

我正在与API通信,并且已经利用了Optional类的用法。但是我觉得错误处理可能会更加优雅,因此,任何有关如何改进此错误的建议都将受到欢迎。我还在实际的api调用中缺少异常处理吗?

public Optional<Account> getGreenqloudAccount(String accountUUid) {
    System.out.println("tmplog: GreenqloudAccountDao->getGreenqloudAccount");
    for (Account account : apiClient.accountList()) {
        if (account.getUuid().equals(accountUUid)) {
            System.out.println("getGreenqloudAccount, account: " + account.toString());
            return Optional.of(account);
        }
    }
    return Optional.empty();
}

public Optional<String> getMarketplaceCustomerIdByUsername(String username) {
    if (username == null || username.equals("")) {
        return Optional.empty();
    }
    AwsMarketplace marketplaceData = apiClient.getMarketplaceData(getKeys(username));
    if (marketplaceData == null) {
        return Optional.empty();
    }
    return Optional.ofNullable(marketplaceData.getObjects().get(0).getCustomerId());
}

private Pair getKeys(String username) {
    GetKeys getKeys = apiClient.getKeys(username);
    return new Pair(getKeys.getApiPrivateKey(), getKeys.getApiPublicKey());
}
java rest optional
3个回答
1
投票

您的代码的主要问题:您将大量的[[非常不同结果扔到了同一个“桶”中。

例如getMarketplaceCustomerIdByUsername()在以下情况下返回空的可选:

    用户名为空
  • 用户名是“”(考虑一下""表示为空,但是" "并不为空?!]
  • 找不到给定用户的AwsMarketplace实例
  • 如上所述,这些是

    非常不同的问题。第一个可能表明:提供的用户名不正确,因此您应将其告知用户。最后一个意思是:“有些东西是可疑的,也许用户是未知的,或者发生了其他事情”。

    因此:请考虑不要将不同的结果减少为空的Optional。而是考虑抛出(不同?)异常。当“无结果”是操作的[[有效
  • 结果时,可以使用Optional。但是“没有结果,因为错误的用户名”感觉上不是有效的结果。

    0
    投票

    使用Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)

    阅读有关可选here的JDK8文档

    另外,您可能需要在检查空字符串之前修剪输入参数


    0
    投票
    public Optional<Account> getGreenqloudAccount(String accountUUid) { System.out.println("tmplog: GreenqloudAccountDao->getGreenqloudAccount"); return apiClient.accountList().stream() .filter(account -> account.getUuId().equals(accountUUid)) .findFirst(); } public Optional<String> getMarketplaceCustomerIdByUsername(String username) { return Optional.ofNullable(username) .filter(name -> !name.isEmpty()) .map(name -> apiClient.getMarketplaceData(getKeys(name))) .map(marketplaceData -> marketplaceData.getObjects().get(0).getCustomerId()); }
    © www.soinside.com 2019 - 2024. All rights reserved.