【问题标题】:How to filter inner Set in Java 8 stream?如何过滤 Java 8 流中的内部集?
【发布时间】:2015-01-16 14:52:05
【问题描述】:

我有对象列表

 List<FrameworkAdminLeftMenu> menu = getMenuFromDB();

每个FrameworkAdminLeftMenu 对象都有方法

public Set<FrameworkAdminLeftMenuCategories> getFrameworkAdminLeftMenuCategorieses() {
        return this.frameworkAdminLeftMenuCategorieses;
}

和方法

public String getCssClassName() {
        return this.cssClassName;
}

每个FrameworkAdminLeftMenuCategories 对象都有方法

public Integer getId() {
        return this.id;
}

如何过滤所有 List 和 Set 以通过 getId(1) 获取 FrameworkAdminLeftMenuCategories 对象?

例如,像

 List<FrameworkAdminLeftMenu> collect = menu.stream()
                .filter(
                        f -> f
                        .getCssClassName()
                        .contains("adm-content")
                )
                .collect(Collectors.toList());

         List<FrameworkAdminLeftMenuCategories> categs = collect
                .stream()
                .filter(
                        f -> f.
                        getFrameworkAdminLeftMenuCategorieses()
                        .stream()
                        .filter(c -> c.getId() == 1)
                )
                .collect(Collectors.toList());

【问题讨论】:

  • “Categorieses”复数的复数? :-)
  • 不完全确定你在问什么。您是否想要从具有该 ID 的所有集合中收集所有类别的集合?在这种情况下,请尝试flatMap

标签: java java-stream


【解决方案1】:

如果我正确理解了这个问题,您希望聚合所有集合中的类别并过滤具有正确 ID 的类别。在这种情况下,您应该使用flatMap

尝试这样的事情(显然未经测试):

 List<FrameworkAdminLeftMenuCategories> categs = menu.stream()
        .filter(f -> f.getCssClassName().contains("adm-content"))
        .flatMap(f -> f.getFrameworkAdminLeftMenuCategorieses().stream())
        .filter(c -> c.getId() == 1)
        .collect(Collectors.toList());

【讨论】:

  • .flatMap(f -> f.getFrameworkAdminLeftMenuCategories()) 上的不可编译代码 flatMap(Function super T,? extends Stream extends R>>) 的类型是错误的R,T 是类型变量: R extends Object 声明在方法 flatMap(Function super T,? extends Stream extends R>>) T extends Object 声明在接口 Stream
  • @ArthurKhusntudinov 我想我在flatMap 行的末尾错过了.stream()。现在可以用了吗?
  • 太棒了!非常感谢!
  • tobias_k,你所说的“Categorieses”复数复数是什么意思?我的实体结构不正确吗?
  • @ArthurKhusntudinov 不,我只是被这个词难住了,似乎每个Categories 对象都聚合了多个类别(因为“类别”是“类别”的复数),因此@ 'categories' 的 987654327@s 因此是 'categories-es',即“复数的复数”;-)
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多