【问题标题】:Convert List<Map<String, Object>> to Map<String, List<Map<String, Object>>> using Java 8 streams API使用 Java 8 流 API 将 List<Map<String, Object>> 转换为 Map<String, List<Map<String, Object>>>
【发布时间】:2018-01-30 04:27:11
【问题描述】:

我的问题与here in stackoverflow 已经提出的问题有点相似。我的输入如下:

Map<String, Object> m1 = new HashMap<>();
m1.put("group", "1");
m2.put("A", 10l);
m2.put("B", 20l);
m2.put("C", 100l);

Map<String, Object> m2 = new HashMap<>();
m1.put("group", "1");
m2.put("A", 30l);
m2.put("B", 40l);
m2.put("C", 500l);

List<Map<String, Object>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);

我的预期输出是:

Map<String, List<Map<String, Object>>> afterFormatting;

输出:

1 -> [m1, m2]

我在下面尝试过,但出现编译错误:似乎我在映射方面做错了:

Map<String, List<Map<String, Object>>> afterFormatting = beforeFormatting.stream()
                    .collect(groupingBy(map -> map.get("group_id"), toList()));

【问题讨论】:

  • 错误:(114, 33) java: 不兼容的类型: 推理变量 K 具有不兼容的边界等式约束: java.lang.String 下界: java.lang.Object

标签: java-8 stream


【解决方案1】:

map.get("group_id") 会返回一个Object,但您尝试将其映射到String,更改返回类型:

Map<Object, List<Map<String, Object>>> afterFormatting = beforeFormatting.stream()
            .collect(Collectors.groupingBy(map -> map.get("group_id")));

您也可以删除toList,因为在使用带有单个参数的groupingBy 时会隐式使用它。

【讨论】:

  • 哇,谢谢!我想我有点迷路了,我的思绪转向了不同的方向。可以像这样进行类型转换: (String)map.get("group_id") 吗?
  • @GauravSaini 如何初步证明正确的类型?
  • '@Eugene 我的预期密钥需要是字符串类型,我不太热衷于保持密钥开放结束。
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多