流-过滤所有未抛出异常

时间:2018-08-09 11:32:31

标签: java list exception java-8 java-stream

比方说,我有一组报告,并且有一种检查用户是否有权阅读每个报告的方法。如果用户没有权限,此方法将引发异常

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());

2 个答案:

答案 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)

我会交换checkReadAuthorizationcheckAuthorization

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 ();
    }
}

这样,您就不会使用异常作为条件。