Java Stream 过滤器嵌套对象返回顶级字段

paw*_*222 3 java java-stream

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

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

class SubItem {
    String name;
    ...
    List<String> ids;
}
Run Code Online (Sandbox Code Playgroud)

我想找到一个Item和它SubItem其中subItem.ids的列表包含一些特定的标识和返回PairItem.nameSubItem.name。我假设所有名称和 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我找到了这个答案如何使用 Stream 过滤嵌套对象,但我还需要返回一些顶级字段(名称)。

Era*_*ran 7

您可以使用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);
Run Code Online (Sandbox Code Playgroud)