Java 列表包含另一个列表,根据逻辑,主列表应进行修改

Java 列表包含另一个列表,根据逻辑,主列表应进行修改,java,list,java-stream,Java,List,Java Stream,我有一个如下所示的对象列表。如果任何成分超过使用日期,结果列表不应包含配方。这可以通过Java流实现吗 我试着像下面这样做,但是得到了一个编译错误。非常感谢您的回复,因为我一直在努力寻找答案 List<Recipes> filteredList = recipeList.stream().filter(recipes -> recipes.getIngredients().stream().filter(ingredients -> ingredients.get

我有一个如下所示的对象列表。如果任何成分超过使用日期,结果列表不应包含配方。这可以通过Java流实现吗

我试着像下面这样做,但是得到了一个编译错误。非常感谢您的回复,因为我一直在努力寻找答案

List<Recipes> filteredList =
    recipeList.stream().filter(recipes -> recipes.getIngredients().stream().filter(ingredients -> ingredients.getUseBy().before(lunchDate)).collect(Collectors.toList()));
Stream().filter()
将一个
谓词
作为参数,并返回一个由该流中与给定谓词匹配的元素组成的流。您的要求可以重新表述为:

List<Recipes> filteredList = recipeList.stream().filter(predicate: recipes does not contain any ingredient past useBy date).collect(Collectors.toList()));
然后将谓词添加到第一个筛选器表达式中。最后的表达是这样的:

List<Recipes> filteredList = recipeList.stream().filter(
    recipes -> recipes.getIngredients().stream()
        .filter(ingredients -> ingredients.getUseBy().after(lunchDate))
        .collect(Collectors.toList()).size() == 0
).collect(Collectors.toList()));
List filteredList=recipeList.stream().filter(
recipes->recipes.getComponents().stream()
.filter(配料->配料.getUseBy().after(午餐日期))
.collect(收集器.toList()).size()=0
).collect(Collectors.toList());
工作示例(不使用JSON)

考虑以下几点:

List<Recipe> filteredList = 
    recipes.stream()
           .filter(r -> ! r.getIngredients()
                           .stream()
                           .anyMatch(i -> i.getUseBy().before(lunchDate)))                         
           .collect(Collectors.toList());
List filteredList=
recipes.stream()
.filter(r->!r.getComponents()
.stream()
.anyMatch(i->i.getUseBy().before(午餐日期)))
.collect(Collectors.toList());
每个配方的说明如下:

  • 拿到配料
  • 在午餐日期之前,找到任何由
    useBy
    使用的“不良”成分
  • 如果存在任何“不良”成分,则排除(通过
    操作员)配方

您可以发布您收到的错误吗?另外,您如何在
recipeList
中存储(我假设的是
JSON
)?错误是必需的,类型为布尔值-提供的列表<代码>配料是每种配方的列表
List<Recipes> filteredList = recipeList.stream().filter(
    recipes -> recipes.getIngredients().stream()
        .filter(ingredients -> ingredients.getUseBy().after(lunchDate))
        .collect(Collectors.toList()).size() == 0
).collect(Collectors.toList()));
List<Recipe> filteredList = 
    recipes.stream()
           .filter(r -> ! r.getIngredients()
                           .stream()
                           .anyMatch(i -> i.getUseBy().before(lunchDate)))                         
           .collect(Collectors.toList());