2015-12-06 114 views
1

无法在try/catch block中包装流对象。Java:捕捉lambda异常

我想是这样的:

reponseNodes.stream().parallel().collect(Collectors.toMap(responseNode -> responseNode.getLabel(), responseNode -> processImage(responseNode))); 

启动Eclipse抱怨强调processImage(responseNode)和建议,它需要Surround with try/catch

然后我更新为:

return reponseNodes.stream().parallel().collect(Collectors.toMap(responseNode -> responseNode.getLabel(), responseNode -> try { processImage(responseNode) } catch (Exception e) { throw new UncheckedException(e); })); 

更新代码也没有工作。

+0

您可以输入Eclipse提供给您的确切警告/错误吗? –

+0

Eclipse警告'环绕着try/catch'强调'processImage(responseNode)'。 –

回答

2

没有直接的方法来处理lambda中的检查异常,只有我想出的选项只是将逻辑移动到另一个方法,可以用try-catch来处理它。

例如

List<FileReader> fr = Arrays.asList("a.txt", "b.txt", "c.txt").stream() 
      .map(a -> createFileReader(a)).collect(Collectors.toList()); 
//.... 
private static FileReader createFileReader(String file) { 
    FileReader fr = null; 
    try { 
     fr = new FileReader(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return fr; 
} 
+2

这可能是最好的。这更可读。 –

+1

> lambadas有史以来最好的错字 –

5

因为拉姆达不再是一个单独的语句,每个语句(包括processImage(responseNode)必须后跟一个;。出于同样的原因,拉姆达也需要一个明确的回报声明(return processImage(responseNode)),并且必须被包裹在{}

因此:

return reponseNodes.stream().parallel() 
     .collect(Collectors.toMap(responseNode -> responseNode.getLabel(), responseNode -> { 
      try { 
       return processImage(responseNode); 
      } catch (Exception e) { 
       throw new UncheckedException(e); 
      } 
     }));