【问题标题】:Java Stream filter nested objects return top level fieldsJava Stream 过滤器嵌套对象返回顶级字段
【发布时间】:2020-06-01 12:30:21
【问题描述】:

我的模型中有以下层次结构:

class Item {
    String name;
    ...
    List<SubItem> subItems;
}

class SubItem {
    String name;
    ...
    List<String> ids;
}

我想找到一个Item 及其SubItem,其中subItem.ids 列表包含一些特定的ID,并返回Item.nameSubItem.namePair。我假设所有名称和 ID 都是唯一的,所以我只对第一个结果感兴趣。

我可以使用两个 foreach 循环来做到这一点:

for (Item item : items) {
    for (SubItem subItem : item.subItems) {
        if (subItem.ids.contains("some value")) {
            return Pair<String, String>(item.name, subItem.name)
        }
    }
}

我想知道是否可以使用 Java 8 Streams 获得相同的结果?

我找到了这个答案How to filter nested objects with Stream,但我还需要返回一些顶级 字段(names)。

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    你可以使用flatMap:

    return items.stream()
                .flatMap(i -> i.getSubItems()
                               .stream()
                               .filter(si -> si.ids.contains("some value"))
                               .map(si -> new Pair<String, String>(i.name, si.name)))
                .findFirst()
                .orElse(null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 2020-11-01
      • 1970-01-01
      • 2011-12-24
      • 2017-03-08
      • 1970-01-01
      • 2016-03-23
      • 2020-07-22
      相关资源
      最近更新 更多