我有用户提供的食谱列表和过敏原列表,我需要返回产品中的食谱列表,其中
alergensOfUser
列表中没有任何过敏原。
每个配方包含产品列表,每个产品包含过敏原列表。我该怎么办?
public class Recipe {
...
private List<Product> products;
}
public class Product {
...
private List<Alergen> alergens;
}
使用 Java 流。 我们需要得到的是,配方是否由每个产品在用户定义的过敏原中没有过敏原的产品制成。
List<Recipe> recipesList;
List<Alergen> userAllergens;
public List<Recipe> getRecipesForUser() {
return recipesList.stream()
.filter(recipe -> isNotMadeOfAlergen(recipe))
.collect(Collectors.toList());
}
public boolean isNotMadeOfAlergen(Recipe recipe) {
List<Product> productList = recipe.products;
return productList.stream().noneMatch(product -> containsAlergen(product));
}
public boolean containsAlergen(Product product) {
List<Alergen> alergenList = product.alergens;
return alergenList.stream()
.anyMatch(alergen -> userAllergens.contains(alergen));
}
如果你想避免 3 层嵌套流,你可以这样做
List<Recipe> userEnteredRecipes; //populate it
List<Alergen> userEnteredAlergens; //populate it
List<Product> allProducts; //populate it
// first get products which have these alergens
List<Product> productsToAvoid =
allProducts.stream()
.filter(e -> e.getAlergens().stream().anyMatch(userEnteredAlergens::contains))
.collect(Collectors.toList());
// get the recipes which do not have these alergens
List<Recipe> filteredRecipes =
userEnteredRecipes.stream()
.filter(e -> (e.getProducts().stream().noneMatch(productsToAvoid::contains)))
.collect(Collectors.toList());