如何将List <object>转换为List <map <string,string>&gt;在java8中

时间:2017-08-05 20:47:00

标签: java lambda java-8 java-stream

我知道如何将List<Object>转换为Map<String,String> 请参阅此代码:

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

这个输出是:

  

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

但我想返回List<Map<String,String>>         输出如下:

  

[“id”:“1”,Name =“A”] [“id”:“2”,Name =“B”]

2 个答案:

答案 0 :(得分:4)

最简单的方法是通过编写单独的toMap辅助方法来帮助自己,将Div转换为Map<String, String>

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());

此外,看起来你正在尝试重新发明一个轮子。考虑使用一些序列化/反序列化库。

答案 1 :(得分:1)

您可以使用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个参数:accumulator(在您的情况下为类型List<Map<String,String>>)和从流迭代(Div对象获取的当前值)并返回累加器类型的值
  • 比较器功能(在这种情况下,lambda (a,b) -> a就够了。

这种方法非常类似于函数式编程中已知的folding