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布尔“意外的返回值”的主要内容,如果未能解决你的问题,请参考以下文章
服务器在 SVN 提交时发送了意外的返回值(500 内部服务器错误)
TortoiseSVN 中继结帐“服务器发送了意外的返回值(403 禁止)以响应 OPTIONS”错误