2015-12-27 110 views
0

這個想法是爲某種編譯器,我試圖實現一個fork語句,啓動另一個線程。 代碼:executor.invokeAll()lambda body不返回

List < Callable <CustomClass>> callList = lista.stream().map(p -> (Callable <CustomClass>)() -> p.oneStep()).collect(Collectors.toList()); //here I just prepared the list of callables 
List <CustomClass> newPrgs; 
try { 
    newPrgs = executor.invokeAll(callList).stream().map(future -> { 
     try { 
      return future.get(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    /here it indicates the error/.filter(p -> p != null).collect(Collectors.toList()); 
} catch (InterruptedException e) { 
    throw new CustomException(e.getMessage()); 
} 

錯誤是:拉姆達體既不值也不空隙兼容。我嘗試了各種各樣的變化和技巧,但沒有結果。請幫忙嗎?

回答

1

的問題是在你的拉姆達的定義...

{ 
    try{ 
     return future.get(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

現在,這是罰款的快樂路徑,剛剛返回從未來的響應,但在此例外的情況下, lambda不會返回值。你需要從異常情況中返回一些東西,或者拋出一個RuntimeException。要做什麼取決於你的用例 - 一個異常會阻止整個流的處理,但是null或默認值可能會污染你的流。

此外,通常最好不要捕捉異常 - 保持捕獲到必要的最小集合/你可以處理。

異常拋出形式會是什麼樣子......

{ 
    try{ 
     return future.get(); 
    } 
    catch (InterruptedException | ExecutionException e){ 
     e.printStackTrace(); 
     throw new RuntimeException(e) 
    } 
} 
+0

解決了這個問題。謝謝你的回答! –

1

看看你的拉姆達的身體:

try { 
    return future.get(); // This branch returns a value 
} catch (Exception e) { 
    e.printStackTrace(); // No return statement here 
} 
// No return statement here either 

所以你的拉姆達既不能被翻譯成無效的方法,而不是轉換爲具有返回值的方法。

您應該在catch或lambda body的末尾有一個返回值。