どのように私はこの中で、コードの重複を解決することができますか?

RafaelKoll:

私はラップ内のすべての成分(トッピングやフィリングが)両方のビーガンとナット自由であるかどうかを確認します。これは私がコードの重複があるように、そのaは非効率的なビットだと思うhowver私は、思い付いたことソリューションです。それを行うには、より効率的な方法はありますか?

(私は一人一人がトッピング/充填がビーガンであれば、それはナットの自由であるかどうかを知るために、ブール含まれるすべてのトッピングやフィリング用のマップを持っています。

public boolean isVegan() {
    for (Topping t : toppings) {
        if (!t.isVegan()) {
            return false;
        }
    }
    for (Filling f : fillings) {
        if (!f.isVegan()) {
            return false;
        }
    }
    return bread.isVegan();
}

public boolean isNutFree() {
    for (Topping t : toppings) {
        if (!t.isNutFree()) {
            return false;
        }
    }
    for (Filling f : fillings) {
        if (!f.isNutFree()) {
            return false;
        }
    }
    return bread.isNutFree();
}
davidxxx:

それが仮にIngredientこれらの異なるクラスの基底クラスであり、このクラスが定義するisVegan()方法を、あなたはすべてのこれらのオブジェクトからのストリームを作成し、すべてがビーガンであるかどうかを計算することができます:

public boolean isVegan() {
    return 
    Stream.concat(toppings.stream(), fillings.stream(), Stream.of(bread))
          .allMatch(Ingredient::isVegan);

}

isNutFree()考えと同じです。

public boolean isNutFree() {
    return 
    Stream.concat(toppings.stream(), fillings.stream(), Stream.of(bread))
          .allMatch(Ingredient::isNutFree);

} 

あなたはさらに重複を減らすためのマッチング方法を一般化できることに注意してください:

public boolean allMatch(Predicate<Ingredient> predicate) {
    return 
    Stream.concat(toppings.stream(), fillings.stream(), Stream.of(bread))
          .allMatch( i -> predicate.test(i));

} 

そして、そのように使用します。

boolean isNutFree = allMatch(Ingredient::isNutFree);
boolean isVegan =  allMatch(Ingredient::isVegan);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=115557&siteId=1