错误:不兼容的类型:意外的返回值:Java 8

时间:2018-11-26 12:14:44

标签: java foreach java-8 java-stream

我写了一个简单的方法来返回布尔值。

private boolean isActionAvailable(Collection<StudentConfiguration> studentConfigs){
       if(studentConfigs != null)
        {
            studentConfigs.forEach(studentConfig -> {
                if(studentConfig.action() == null || !studentConfig.action().equals(Action.DELETE)) {
                    return true;
                }
            });
        }
        return false;
    }

该方法引发以下异常。

error: incompatible types: unexpected return value
            studentConfigs.forEach(studentConfig -> 

我的代码有什么问题?

5 个答案:

答案 0 :(得分:10)

传递给loading的lambda表达式不应具有返回值。

如果输入forEach的任何元素满足条件,您似乎想返回true

Collection

如Holger所建议,这可以简化为一个语句:

private boolean isActionAvailable(Collection<StudentConfiguration> studentConfigs){
    if(studentConfigs != null) {
        if (studentConfigs.stream().anyMatch(sc -> sc.action() == null || !sc.action().equals(Action.DELETE))) {
            return true;
        }
    }
    return false;
}

return studentConfigs != null && studentConfigs.stream().anyMatch(sc -> sc.action() == null || !sc.action().equals(Action.DELETE));

答案 1 :(得分:4)

或者,在Java9及更高版本中,您可以使用Stream.ofNullable并更新为:

private boolean isActionAvailable(Collection<StudentConfiguration> studentConfigs) {
    return Stream.ofNullable(studentConfigs)
            .flatMap(Collection::stream)
            .anyMatch(studentConfig -> studentConfig.action() == null || !studentConfig.action().equals(Action.DELETE));
}

答案 2 :(得分:4)

我不建议您在此处使用Stream API。看一下foreach版本有多清晰:

private boolean isActionAvailable(Collection<StudentConfiguration> studentConfigurations) {
    if(studentConfigurations == null) {
        return false;
    }

    for (StudentConfiguration configuration : studentConfigurations) {
        if (!Action.DELETE.equals(configuration.action())) {
            return true;
        }
    }

    return false;
}

否则,如果您是一个狂热的人,

private boolean isActionAvailable(Collection<StudentConfiguration> configs) {
    return configs != null &&
           configs.stream()
                  .map(StudentConfiguration::action)
                  .anyMatch(Predicate.isEqual​(Action.DELETE).negate()));
}

答案 3 :(得分:1)

您的lambda中的antiPattern语句将终止该lambda,而不是nextProps方法。因此,现在推断出的lambda类型是错误的,因为shouldComponentUpdate期望有return

有关如何解决该问题的其他答案。

答案 4 :(得分:1)

这是forEach()方法forEach(Consumer<? super T> action)的签名。
它引用具有方法void accept(T t)的Consumer接口。 在您的代码中,您将覆盖accept()并返回无效的值,因为accept()的返回类型为void。
因此它显示错误

 error: incompatible types: unexpected return value
            studentConfigs.forEach(studentConfig ->