2016-06-14 34 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

相關問題