Java收集返回顶级项目的嵌套地图流

问题描述 投票:0回答:1

我有以下模型:

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

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

对于id中的每个subItem.ids,我想提取一些顶级参数。为此,我定义了一个自定义元组:

class AdditionalParams {
    private final String itemName;
    private final String subItemName;
    ...
}

目标是返回Map<String, AdditionalParams>(键:subItem.ids中的id,值:该id的AdditionalParams)。

我假设ID是唯一的,所以在向地图添加元素时不会有任何冲突。

我的解决方案

我尝试将flatMapCollectors.toMap结合使用:

List<Item> allItems = ...
Map<String, AdditionalParams> result = allItems
    .stream()
    .flatMap(i -> i.getSubItems()
                   .stream()
                   .map(si -> si.getIds()
                                .stream()
                                .collect(
                                    Collectors.toMap(
                                        Function.identity(),
                                        id -> new AdditionalParams(i.getName(), si.getName())
                                    )
                                )
                   )
    )  // Stream< Map<String, AdditionalParams> >
    .collect(
        Collectors.toMap(m -> m.getKey(), m -> m.getValue())
    )

问题是最后一行(.collect(Collectors.toMap(...)不起作用(或者我做错了)。我尝试遵循此答案Convert List of Maps to single Map via streams,但也无法使其正常工作。

我的方法在做什么错?如何获得Map<String, AdditionalParams>类型的结果?

还有如何使它更清洁/更快/更好? ((我知道我的解决方案远非完美)

java stream collectors
1个回答
0
投票

您可以采取的解决措施是将中间状态映射到映射的条目,然后收集它们。就像-

© www.soinside.com 2019 - 2024. All rights reserved.