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