【问题标题】:How to properly return Optional<> of a method?如何正确返回方法的 Optional<>?
【发布时间】:2016-06-14 12:17:18
【问题描述】:

我已经阅读了很多 Java 8 Optional 并且我理解这个概念,但是在我自己尝试在我的代码中实现它时仍然遇到困难。

虽然我已经在网上搜索了很好的例子,但我没有找到一个很好的解释。

我有下一个方法:

public static String getFileMd5(String filePath) throws NoSuchAlgorithmException, IOException {
    AutomationLogger.getLog().info("Trying getting MD5 hash from file: " + filePath);
    MessageDigest md = MessageDigest.getInstance("MD5");
    InputStream inputStream;
    try {
        inputStream = Files.newInputStream(Paths.get(filePath));
    } catch (NoSuchFileException e) {
        AutomationLogger.getLog().error("No such file path: " + filePath, e);
        return null;
    }

    DigestInputStream dis = new DigestInputStream(inputStream, md);
    byte[] buffer = new byte[8 * 1024];

    while (dis.read(buffer) != -1);
    dis.close();
    inputStream.close();

    byte[] output = md.digest();
    BigInteger bi = new BigInteger(1, output);
    String hashText = bi.toString(16);
    return hashText;
}

这个简单的方法通过将文件路径传递给文件来返回文件的 md5。 如您所见,如果文件路径不存在(或输入错误),则会抛出 NoSuchFileException 并且该方法返回 Null

我想使用Optional而不是返回null,所以我的方法应该返回Optional &lt;String&gt;,对吗?

  1. 正确的做法是什么?
  2. 如果返回的字符串为空 - 我可以在这里使用orElse(),或者这个 客户端应该使用什么样的方法?

【问题讨论】:

  • 您是否真的尝试过您描述的那种方法?是什么让您认为有更好的方式来使用Optional
  • 您看过 API 文档了吗? Java Docs OptionalOracle 在Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional! 也有一些非常不错的用例和示例
  • @E_net4 - 为什么不在这里使用 Optional ?这是一个经典的例子。我想避免我的方法重新调整 null。
  • @Underbalanced - 我看过了。确实很好,但对我的情况没有帮助
  • 我不明白,为什么声明抛出IOException 的方法应该在NoSuchFileException 上返回任何内容,无论是null 还是空的Optional。看到方法签名的每个人都希望 NoSuchFileException 被转发给调用者。

标签: java optional


【解决方案1】:

没错。

public static Optional<String> getFileMd5(String filePath)
        throws NoSuchAlgorithmException, IOException {

        return Optional.empty(); // I.o. null

    return Optional.of(nonnullString);
}

用法:

getFileMd5(filePath).ifPresent((s) -> { ... });

或(不如撤消可选)

String s = getFileMd5(filePath).orElse("" /* null */);

【讨论】:

  • 为什么第二个“撤消”可选?如果可选返回为空 - 客户端使用一些默认值(orElse)
  • @Nimrod 撤消我的意思是你有一个字符串,你需要检查它是否可以用作 MD5。那么有一个空值会更清楚:未检查时的快速失败 - NullPointerException。但你在一定程度上是对的。对于存储可选的 MD5 可能很有用。
  • 再次感谢并抱歉再次询问 - 在底线 - 你认为可选在这里是必不可少的吗?返回的 null 是我在我的方法中手动抛出的,它不是经典的 nullPointerException。
  • 对不起,我的意思是,当使用字符串时,即使它不是 MD5 - 例如 null 或 ""。然后它可能会被错误地提交给未经检查的 MD5 解密/加密。那么 null 会比“密钥无效”带来更好的失败。 - 即“程序员,请捕捉 NullPointerException”。
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 2015-09-05
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多