2016-06-14 37 views
3

我已经阅读了很多Java 8可选的,并且我理解这个概念,但是在尝试在我的代码中自己实现它时仍然遇到困难。如何正确返回方法的可选<>?

尽管我已经通过网络为例子做了很好的介绍,但是我没有找到一个很好的解释。

我有一个方法:

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 <String>,对不对?

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

你有没有真正尝试这种方法你描述?是什么让你觉得有更好的方法来使用'Optional'? –

+1

你有没有看过API文档? [Java文档可选](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)Oracle还有一些相当不错的用例和例子[厌倦了空指针异常?考虑使用Java SE 8的可选!](http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html) – Underbalanced

+0

@ E_net4 - 为什么不在这里使用Optional?这是一个典型的例子。我想避免我的方法重新调用null。 – Nimrod

回答

14

对。

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 */); 
+0

为什么第二个'撤销'可选? 如果可选项返回为空 - 客户端通过撤销使用一些默认的(或者是) – Nimrod

+0

@Nimrod我意味着你再次有一个字符串,你需要检查它是否可以用作MD5。如果有一个空值,那么会更加清楚:未检查时失败 - 一个NullPointerException。但你是正确的学位。可用于存储可选的MD5。 –

+0

再次感谢并抱歉再次提出要求 - 底线 - 您是否认为可选是必要的?返回的null是手动抛出我的方法,它不是一个经典的空指针异常。 – Nimrod

相关问题