首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 8:用另一个列表筛选对象内部的列表

Java 8:用另一个列表筛选对象内部的列表
EN

Stack Overflow用户
提问于 2019-12-25 03:43:39
回答 4查看 3.8K关注 0票数 0

我有一个名为"foodList“的列表,其中包含"Food”类型的元素。对象Food包含一个名为“类别”的“类别”类型的列表。

我目前正在实施一种搜索算法,通过排除某些类别来过滤食物。

排除的类别存储在名为"excludedCategories“的列表中。

我如何使用Java8和streams,通过排除其foodList包含excludedCategories列表中的任何元素的foodList来过滤excludedCategories?

带循环的示例代码:

代码语言:javascript
运行
复制
for (Food f: foodList)
{
     for (Category c: f.categories)
     {
          if (excludedCategories.contains(c))
          {
               // REMOVE ITEM FROM foodList
          }
     }
}

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-25 03:53:20

不应该使用流来修改List。相反,您应该返回一个只包含适当元素的新List。您可以简单地翻转一下逻辑并使用过滤器:

代码语言:javascript
运行
复制
foodList.stream().flatMap(e -> e.categories.stream())
                 .filter(c -> !excludedCategories.contains(c))
                 .collect(Collectors.toList());

但是,使用内置的方法要简单得多:

代码语言:javascript
运行
复制
foodList.removeIf(e -> !Collections.disjoint(e.categories, excludedCategories));

Collections::disjoint

Collections::removeIf

票数 5
EN

Stack Overflow用户

发布于 2019-12-25 04:10:47

使用streamexcluded类别进行filter,如下所示

代码语言:javascript
运行
复制
foodList.stream()
        .filter(f -> f.categories.stream().noneMatch(c -> excludedCategories.contains(c)))
        .collect(Collectors.toList());
票数 1
EN

Stack Overflow用户

发布于 2019-12-25 04:42:06

你可以这样做

代码语言:javascript
运行
复制
    foodList.stream().filter(f -> {
        f.setCats(f.getCats().stream().filter(c -> (!excludedCategories.contains(c))).collect(Collectors.toList()));
        return true;
    }).collect(Collectors.toList()).forEach(System.out::println);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59475050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档