如何在Java中过滤嵌套列表?

问题描述 投票:0回答:2

我有用户提供的食谱列表和过敏原列表,我需要返回产品中的食谱列表,其中

alergensOfUser
列表中没有任何过敏原。

每个配方包含产品列表,每个产品包含过敏原列表。我该怎么办?

public class Recipe {

    ...

    private List<Product> products;

}


public class Product {
   
    ...

    private List<Alergen> alergens;

}
java list filter nested java-stream
2个回答
1
投票

使用 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));
}

0
投票

如果你想避免 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());
© www.soinside.com 2019 - 2024. All rights reserved.