4

いくつかの独立した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() 条件のいずれかが実行された場合、ループで続行するように残りの条件をスキップする最良の方法は何ですか

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 を使用して、De Morgan の法則を適用することにより、この式のロジックをリファクタリングできます。ほとんどの適切な IDE は、数回のキーストロークでこれを実行できます。

于 2012-10-05T19:09:57.243 に答える
8

早期に戻り、残りをスキップする複数の return ステートメントを使用することで、このように要約できます。簡潔にするために、不要な中括弧も削除しました。

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;

あなたのifの中。リターンは何度でも使えます。

于 2012-10-05T19:09:53.460 に答える
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;
    }
}

このアイデアはかなりスケールアップし、いくつかの非常に興味深い実装を可能にします。

于 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

return false最初の条件文に a を入れるだけです。

于 2012-10-05T19:09:59.490 に答える