Java 布尔值 "Unexpected return value"

Java boolean "Unexpected return value"

我是 Java 的新手,我不明白为什么 IDE 在我声明布尔值为真的 forEach 中说“意外的 return 值”或通过 If 语句为假。 我的目标是检查“States”HashMap 中是否有一个对象已经使用了我想设置为新状态的名称。 (HashMap 的键是一个名为 IdentifierOfState 的字符串,值是我的 State 对象,其中包含名称等变量。)在此先感谢您的帮助!

public boolean isStateNameClaimed(String NameOfState)
{
    States.forEach((IdentifierOfState, ValueOfState) ->
    {
        if (ValueOfState.getNameOfState().equalsIgnoreCase(NameOfState)) {return true;}
        else {return false;}
    });
    return false;
}

forEach 将为每个元素调用给定的可调用函数。我们不能为该函数设置 return 值。

尝试使用“过滤器”或将结果分配给局部变量。

Return from lambda forEach() in java

问题是您试图 return 将结果放在错误的位置。 {return true;}{return true;} 在 lambda 中,因此它们试图 return lambda 的结果 。但是该 lambda 的推断类型签名不允许 returned.

任何值

如果您的意图是那些 return 语句应该 returning 来自 isStateNameClaimed 的结果,那么更好的解决方案是只使用 for 循环来迭代 States.

的元素

您的 Java 代码包含许多严重的 Java 风格违规,这于事无补。变量名不应以大写字母开头。它会混淆......然后惹恼......其他阅读你的代码的人。

你可能会说:“不,我不需要遵守规则,因为没有其他人会阅读我的代码”。但是你要求>>我们<<阅读你的代码。

I'm new to Java ...

...所以现在是学习正确操作的时候了。 Java 风格对阅读您代码的人很重要。


这就是我在经典中的写法Java:

public boolean isStateNameClaimed(String name) {
    for (State v: states.values()) {
        if (v.getNameOfState().equalsIgnoreCase(name)) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}

或使用流:

public boolean isStateNameClaimed(String name) {
    return states.values().stream().anyMatch(
        (v) -> v.getNameOfState().equalsIgnoreCase(name));
}

实际上...我只是注意到这两个解决方案并不等效。根据你对你正在尝试做的事情的描述,这可能意味着第一个 和你最初的尝试 在算法上是不正确的。