我有几个独立的if条件,在每个条件下,我将评估一个布尔变量值为true或false。
如果布尔变量值在第一个if条件中变为false,那么我如何跳过所有条件的其余部分。
private static boolean isRecommended(Fruit fruit) {
boolean isRecommended = true;
if(fruit.weight > 2){
isRecommended = false;
}
if(!"red".equals(fruit.color)){
isRecommended = false;
}
if(!"sweet".equals(fruit.taste)){
isRecommended = false;
}
if(!fruit.isPerishable){
isRecommended = false;
}
return isRecommended;
}
如果执行第一个if()条件,则可以返回该值。我知道在循环中我们可以使用continue
关键字来跳过循环执行的其余部分。我们怎样才能在这里实现类似的东西。
更新
我并不完全意味着在第一个if()条件下,如果执行任何if()条件,那么跳过其余条件的最佳方法是什么,例如在循环中继续执行
答案 0 :(得分:28)
return fruit.weight <= 2
&& "red".equals(fruit.color)
&& "sweet".equals(fruit.taste)
&& fruit.isPerishable;
答案 1 :(得分:9)
对于一般解决方案,您可以使用else if
:
if(fruit.weight > 2){
isRecommended = false;
}
else if(!"red".equals(fruit.color)){
//etc...
}
但在您的具体示例中,您可以使用布尔逻辑:
return !(
fruit.weight > 2 ||
!"red".equals(fruit.color) ||
!"sweet".equals(fruit.taste) ||
!fruit.isPerishable
);
您可以使用IDE通过应用De Morgan's laws来重构此表达式的逻辑。大多数不错的IDE都可以通过几次击键为您完成此操作。
答案 2 :(得分:8)
你可以像这样压缩它,使用多个返回语句,它们将提前返回并跳过其余部分。为了更加简洁,我还删除了不需要的花括号。
private static boolean isRecommended(Fruit fruit) {
if(fruit.weight > 2)
return false;
if(!"red".equals(fruit.color))
return false;
if(!"sweet".equals(fruit.taste))
return false;
if(!fruit.isPerishable)
return false;
return true;
}
答案 3 :(得分:6)
如果执行第一个if()条件,则可以返回 价值。
不就是这样吗?
if(fruit.weight > 2){
return false; // etc.
}
或者我误解了你的问题?
答案 4 :(得分:5)
测试将在第一次未经验证时停止。
private static boolean isRecommended(Fruit fruit) {
return
fruit.weight <= 2
&& "red".equals(fruit.color)
&& "sweet".equals(fruit.taste)
&& fruit.isPerishable
;
}
答案 5 :(得分:3)
你可以写
return isRecommended;
在你的ifs里面。 return可以多次使用。
答案 6 :(得分:0)
只需在第一个条件中添加return false
。
答案 7 :(得分:0)
简单的答案是return
块中的if
,而不是设置值。但是,这不是完全可扩展的,并且块内return
会增加代码复杂性。
复杂但更灵活的答案是创建一个允许您实现自定义逻辑的interface
。
interface RecommendationFilter<T>
{
boolean recommend(T item);
}
然后,在某些实现中,可以使用一堆通用加载的RecommendationFilter
来循环。
class FruitChecker
{
private final Set<RecommendationFilter<Fruit>> filters = ...;
public boolean isRecommended(Fruit fruit)
{
boolean recommended = true;
for (RecommendationFilter<Fruit> filter : filters)
{
if ( ! filter.recommend(fruit))
{
recommended = false;
break;
}
}
return recommended;
}
}
这个想法可以很好地扩展,它可以实现一些非常有趣的实现。
答案 8 :(得分:0)
将if
语句中的其余else
语句包装在其中:
private static boolean isRecommended(Fruit fruit) {
boolean isRecommended = true;
if(fruit.weight > 2){
isRecommended = false;
} else {
if(!"red".equals(fruit.color)){
isRecommended = false;
}
if(!"sweet".equals(fruit.taste)){
isRecommended = false;
}
if(!fruit.isPerishable){
isRecommended = false;
}
}
return isRecommended;
}
P.S。我强烈建议使用空格而不是制表符进行缩进。标签通常不会以您希望的方式移植到其他编辑器或环境。
答案 9 :(得分:0)
我找到了另一种解决方案,即使用带break语句的标签块。以下是代码
private static boolean isRecommended(Fruit fruit) {
boolean isRecommended = true;
labelA:
{
if(fruit.weight > 2){
isRecommended = false;
break labelA;
}
if(!"red".equals(fruit.color)){
isRecommended = false;
break labelA;
}
if(!"sweet".equals(fruit.taste)){
isRecommended = false;
break labelA;
}
if(!fruit.isPerishable){
isRecommended = false;
}
}
return isRecommended;
}
答案 10 :(得分:0)
private static boolean isRecommended(Fruit fruit) {
while(true)
{
boolean isRecommended = true;
if(fruit.weight > 2){
isRecommended = false;
break;
}
if(!"red".equals(fruit.color)){
isRecommended = false;
break;
}
if(!"sweet".equals(fruit.taste)){
isRecommended = false;
break;
}
if(!fruit.isPerishable){
isRecommended = false;
break;
}
}
return isRecommended;
}