4

我有几个独立的 if 条件,在每个条件下,我将评估一个布尔变量值,无论是真还是假。

如果布尔变量值在第一个 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() 条件,那么像 continue 在循环中那样跳过其余条件的最佳方法是什么

4

11 回答 11

28
return fruit.weight <= 2 
    && "red".equals(fruit.color) 
    && "sweet".equals(fruit.taste)
    && fruit.isPerishable;
于 2012-10-05T19:10:05.753 回答
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 通过应用德摩根定律来重构此表达式的逻辑。大多数体面的 IDE 只需敲几下键就可以为您做到这一点。

于 2012-10-05T19:09:57.243 回答
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;
}
于 2012-10-05T19:11:53.833 回答
6

如果执行了第一个 if() 条件,那么是否可以返回该值。

不就是这样吗?

if(fruit.weight > 2){
    return false; // etc.
}

还是我误解了你的问题?

于 2012-10-05T19:10:49.567 回答
5

测试将在第一次未验证时停止。

private static boolean isRecommended(Fruit fruit) {
    return 
            fruit.weight <= 2
            && "red".equals(fruit.color)
            && "sweet".equals(fruit.taste)
            && fruit.isPerishable
    ;
}
于 2012-10-05T19:09:57.737 回答
3

你可以写

return isRecommended;

在你的ifs里面。return 可以多次使用。

于 2012-10-05T19:09:53.460 回答
0

只需return false在您的第一个条件中添加 a 即可。

于 2012-10-05T19:09:59.490 回答
0

简单的答案是returnif块内,而不是设置一个值。但是,这并不是完全可扩展的,并且return块内的 ing 会增加代码复杂性。

复杂但更灵活的答案是创建一个interface允许您实现自定义逻辑的方法。

interface RecommendationFilter<T>
{
    boolean recommend(T item);
}

然后,在某些实现中,可以使用一堆一般加载RecommendationFilter的 s 来循环。

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

这个想法可以很好地扩展,并且可以实现一些非常有趣的实现。

于 2012-10-05T19:18:27.097 回答
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;
}

ps 我强烈建议使用空格而不是制表符进行缩进。选项卡通常不会以您想要的方式移植到其他编辑器或环境。

于 2012-10-05T19:34:49.940 回答
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;


}
于 2012-10-12T18:18:28.507 回答
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;
}
于 2017-08-08T20:05:43.490 回答