繁体   English   中英

Java 8:将 2 个列表转换为 Map 列表

[英]Java 8: Convert 2 Lists into List of Map

我有什么:(2个清单)

List<String> keys = Arrays.asList("1", "2", "3");
List<String[]> values = Arrays.asList("a,aa,aaa".split(","), "b,bb,bbb".split(","));

我想得到什么:(地图列表)

[
    {"1": "a", "2": "aa", "3": "aaa"},
    {"1": "b", "2": "bb", "3": "bbb"}
]

Java 7 解决方案:

List<Map<String,String>> list = new LinkedList<Map<String,String>>();
for(String[] vs: values) {
    Map<String, String> map = new LinkedHashMap<String, String>();
    for(int i = 0; i < keys.size(); i++) {
        map.put(keys.get(i), vs[i]);
    }
    list.add(map);
}

我正在学习 Java 8 和 Steam。 我想知道是否有可能做得更干净。

一种方法是迭代values ,然后迭代每个数组的索引,将它们与keys的相应索引匹配:

List<Map<String, String>> maps = values.stream()
        .map(a -> IntStream.range(0, keys.size())
                .boxed()
                .collect(Collectors.toMap(keys::get, i -> a[i])))
        .collect(Collectors.toList());

不幸的是,为了使用toMap()收集器,中间装箱是必要的。 如果你想避免盒装索引的开销,你可以在内部流中定义一个自定义收集器:

IntStream.range(0, keys.size())
    .collect(HashMap<String, String>::new,
        (m, i) -> m.put(keys.get(i), a[i]),
        HashMap::putAll)

请在下面找到两种使用 java 8 流实现此目的的方法:

列表值 =Arrays.asList("a,aa,aaa".split(","), "b,bb,bbb".split(","));

      List<Map<String, String>> maps= values.stream().map(l-> IntStream.range(0, l.length).boxed().collect(Collectors.toMap(i-> String.valueOf(i+1), j-> l[j]))).collect(Collectors.toList());
      System.out.println("Printing list of map using boxed"+ maps);

      List<Map<String, String>> maps2= values.stream().map(l-> IntStream.range(0, l.length).mapToObj(a-> Integer.valueOf(a)).collect(Collectors.toMap(i-> String.valueOf(i+1), j-> l[j]))).collect(Collectors.toList());
      System.out.println("Printing list of map using maptoObject"+ maps2);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM