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

Ram*_*m R 11 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;
    }
Run Code Online (Sandbox Code Playgroud)

该方法抛出以下异常.

error: incompatible types: unexpected return value
            studentConfigs.forEach(studentConfig -> 
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?

Era*_*ran 10

传递给的lambda表达式forEach不应该有返回值.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

正如霍尔格所说,这可以简化为一个声明:

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

要么

return studentConfigs != null ? studentConfigs.stream().anyMatch(sc -> sc.action() == null || !sc.action().equals(Action.DELETE)) : false;
Run Code Online (Sandbox Code Playgroud)

  • 为什么不是一个简单的增强型forloop?你什么时候选择一个而不是另一个? (2认同)

And*_*lko 5

我不建议您在这里使用 Stream API。看看这个foreach版本是多么清晰和简单:

\n\n
private boolean isActionAvailable(Collection<StudentConfiguration> studentConfigurations) {\n    if(studentConfigurations == null) {\n        return false;\n    }\n\n    for (StudentConfiguration configuration : studentConfigurations) {\n        if (!Action.DELETE.equals(configuration.action())) {\n            return true;\n        }\n    }\n\n    return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
private boolean isActionAvailable(Collection<StudentConfiguration> configs) {\n    return configs != null &&\n           configs.stream()\n                  .map(StudentConfiguration::action)\n                  .anyMatch(Predicate.isEqual\xe2\x80\x8b(Action.DELETE).negate()));\n}\n
Run Code Online (Sandbox Code Playgroud)\n