我有一个名为“ foodList”的列表,其中包含“食物”类型的元素。食物对象包含类型为“类别”的名为“类别”的列表。
我目前正在实施一种搜索算法,以通过排除某些类别来过滤食物。
排除类别存储在名为“ excludedCategories”的列表中。
我如何使用Java 8和流,通过排除其categoryLists包含exclude includedCategories列表中任何元素的Food对象来过滤foodList?
带循环的示例代码:
for (Food f: foodList)
{
for (Category c: f.categories)
{
if (excludedCategories.contains(c))
{
// REMOVE ITEM FROM foodList
}
}
}
谢谢!
最佳答案
流不应该用于修改List
。相反,您应该返回仅包含适当元素的新List
。您可以稍微翻转一下逻辑并使用过滤器:
foodList.stream().flatMap(e -> e.categories.stream())
.filter(c -> !excludedCategories.contains(c))
.collect(Collectors.toList());
但是,使用内置方法会更加简单:
foodList.removeIf(e -> !Collections.disjoint(e.categories, excludedCategories));
Collections::disjoint
Collections::removeIf