【问题标题】:How to convert List<Object> into List<Map<String,String>> in java8如何在 java8 中将 List<Object> 转换为 List<Map<String,String>>
【发布时间】:2017-08-06 15:33:05
【问题描述】:

我知道如何尽可能地将List&lt;Object&gt; 转换为Map&lt;String,String&gt; 请参阅此代码:

Map<Long, String> divMap = divs.stream()
  .collect(Collectors.toMap(Div::getId, Div::getName));

这个的输出是:

“1”:“A”,“2”:“B”

但我想返回List&lt;Map&lt;String,String&gt;&gt; 输出如下:

["id":"1",Name="A"] ["id":"2",Name="B"]

【问题讨论】:

  • 尝试使用 Map result1 = list.stream().collect(Collectors.toMap(string1, string2));,Collectors.toMap 是一个 API fpr 这样做
  • 请仔细阅读问题,这是我正在做的,但我想返回 List 而不是 Map

标签: java lambda java-8 java-stream


【解决方案1】:

最简单的方法是编写一个单独的 toMap 帮助器方法来帮助自己,该方法将 Div 转换为 Map&lt;String, String&gt;

private Map<String, String> toMap(Div div) {
    Map<String, String> result = new HashMap<>();
    result.put("id", div.getId().toString());
    result.put("name", div.getName());
    return result;
}

...然后一切都变得容易了

List<Map<String, String>> divMap = divs.stream()
  .map(this::toMap)
  .collect(Collectors.toList());

此外,您似乎正在尝试重新发明一个轮子。考虑使用一些序列化/反序列化库。

【讨论】:

    【解决方案2】:

    你可以使用Stream的reduce方法,比如:

    final List<Div> divs = Arrays.asList(
           new Div("1", "A"),
           new Div("2", "B")
    );
    
    final List<Map<String, String>> result = divs.stream()
           .reduce(new ArrayList<>(), (list, div) -> {
                list.add(new HashMap<String, String>() {{
                   put("id", div.getId());
                   put("name", div.getName());
                }});
                return list;
            }, (a, b) -> a);
    

    Reduce 方法需要 3 个参数:

    • 初始值(本例为空列表)
    • BiFunction 提供 2 个参数:累加器(在您的情况下为 List&lt;Map&lt;String,String&gt;&gt;)和从流迭代中获取的当前值(Div 对象)并返回累加器类型的值
    • 比较器函数(在这种情况下 lambda (a,b) -&gt; a 就足够了。

    这种方法与函数式编程中已知的folding 非常相似。

    【讨论】:

    • reduce 太过分了,请检查我的答案 :)
    • @GrzegorzPiwowarek 确实,为更聪明的方法竖起大拇指 :D :+1: 我不知道为什么我一开始就想减少 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多