Java布尔“意外的返回值”

Posted

技术标签:

【中文标题】Java布尔“意外的返回值”【英文标题】:Java boolean "Unexpected return value" 【发布时间】:2022-01-10 08:00:21 【问题描述】:

我是 Java 新手,我不明白为什么 IDE 在 forEach 中说“意外的返回值”,我通过 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;

【问题讨论】:

【参考方案1】:

问题是您试图在错误的位置返回结果。 return true;return true; 在 lambda 中,因此它们试图为 lambda 返回一个结果。但是该 lambda 的推断类型签名不允许返回任何值。

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


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

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

我是 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));


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

【讨论】:

谢谢,我认为问题在于编译器会认为返回的是 lambda 而不是布尔值,但我不确定。另外,感谢您提到样式,我已经使用 C# 编程多年,但我还没有习惯 Java 样式,但我会努力使其代码清晰!【参考方案2】:

forEach 将为每个元素调用一个给定的可调用函数。我们不能有返回值给那个函数。

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

Return from lambda forEach() in java

【讨论】:

以上是关于Java布尔“意外的返回值”的主要内容,如果未能解决你的问题,请参考以下文章

java - 错误不兼容类型:意外返回值 - 遍历列表

计算平均值时的意外返回值?

服务器在 SVN 提交时发送了意外的返回值(500 内部服务器错误)

TortoiseSVN 中继结帐“服务器发送了意外的返回值(403 禁止)以响应 OPTIONS”错误

SVN-server发送了意外的返回值(405 Method Not Allowed)

返回布尔值的 Java 方法的命名约定