如果标志为false,则跳过条件

时间:2012-10-05 19:07:56

标签: java

我有几个独立的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()条件,那么跳过其余条件的最佳方法是什么,例如在循环中继续执行

11 个答案:

答案 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;
}