java - 将 map 列表合并为单个 map

标签 java list dictionary java-stream

我正在尝试将 map 列表合并为一个:

List<Map<String, List<Long>>> dataSet;
Map<String, Set<Long>> uniqueSets = dataset.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collector.of(
            HashSet<Long>::new,
            ...,
            ...
        )
    ));

想法是 uniqueSet 应该在每个集合(由字符串标识)中保存一个唯一 ID(Longs)列表。但我不确定 ... 部分。

至于所请求的示例(JSON 格式):

输入:

[
    {
        "Collection1": [1, 2, 3, 3],
        "Collection2": [2, 3]
    },
    {
        "Collection1": [3, 4],
        "Collection3": [1, 2]
    }
]

输出:

{
    "Collection1": [1, 2, 3, 4],
    "Collection2": [2, 3],
    "Collection3": [1, 2]
}

最佳答案

如果我理解你的问题,如果给出这两张 map :

{Mike=[5, 6], Jack=[1, 2, 3]}
{Fred=[7, 8], Jack=[4, 5]}

你想像这样组合它们:

{Mike=[5, 6], Fred=[7, 8], Jack=[1, 2, 3, 4, 5]}

给你:

Map<String, List<Long>> uniqueSets = dataset.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collector.of(
            ArrayList<Long>::new,
            (list, item) -> list.addAll(item.getValue()),
            (left, right) -> { left.addAll(right); return left; })
    ));

即:

  • 供应商说对了:创建一个新的 ArrayList 来累加值
  • 第二部分是累加器:它接受一个容器(列表)和一个项目,并将项目添加到容器中。请注意,这些项目是 Map.Entry 实例。
  • 最后一部分是组合器,将两个由累加器填充的容器合并为一个

关于java - 将 map 列表合并为单个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45173309/

相关文章:

java - 基于 Spring Profile 的 Jersey Rest 服务发布

java - 比较没有时间的日期

java - 将 CSV 导入 Jpanel 上的 JTable(无 CSVReader)

r - 从 R 中的列表中获取整个列表作为 Json

python - 在 python 中订购字典列表

java - ArrayList 的 removeRange 方法如何工作?

python - 追加到行/列长度未知的 python 中的二维列表

sql-server - List(of T) 与 DataTable 填充数据库

python - 使用 Python 列表理解从嵌套元组字典结构中检索数据

json - mongoengine中EmbeddedDocumentField和ReferenceField有什么区别