比方说,我有一组报告,并且有一种检查用户是否有权阅读每个报告的方法。如果用户没有权限,此方法将引发异常
checkReadAuthorization(Report report) throw AccessViolationException;
是否可以过滤掉此方法引发异常的所有报表?像这样:
reports.stream()
.filterThrowingException(this::checkReadAuthorization);
现在我有一个函数,如果抛出异常,该函数返回true或false,但是我想知道是否有更好的方法来实现这一目标
private boolean checkAuthorization(Report report) {
try {
checkReadAuthorization(report);
return true;
} catch(AccessViolationException ex) {
return false;
}
}
然后在这样的过滤器中使用它
return dossiers.stream()
.filter(this::checkAuthorization)
.collect(Collectors.toList());
答案 0 :(得分:5)
当前的Stream-API中没有类似“ filterThrowingException
”的内容。您只能使用Report
内的try-catch
来决定保留或过滤Stream::filter
:
List<Report> filtered = list.stream().filter(report -> {
try {
this.checkAuthorization(report);
} catch (AccessViolationException ex) {
return false;
}
return true;
}).collect(Collectors.toList());
我个人建议更改方法checkReadAuthorization
的接口以返回boolean
,以指示输入是否有效。
private boolean checkReadAuthorization(Report report) { /* ... */ }
该结果可以用作过滤器中的谓词。
List<Report> filtered = list.stream()
.filter(this::checkReadAuthorization)
.collect(Collectors.toList());
摘要:最好更改验证类和方法的设计,而不要尝试使用Stream-API来适应非最佳选择。
答案 1 :(得分:0)
我会交换checkReadAuthorization
和checkAuthorization
:
private boolean checkAuthorization(Report report)
{
// put here the logic that checks for authorization, but without throwing exception
}
void checkReadAuthorization(Report report) throw AccessViolationException
{
if (!checkAuthorization(report)) {
throw new AccessViolationException ();
}
}
这样,您就不会使用异常作为条件。