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

时间:2018-03-06 01:56:01

标签: java java-stream

我有什么:(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。我想知道是否可以做得更清洁。

2 个答案:

答案 0 :(得分:2)

一种方法是迭代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)

答案 1 :(得分:0)

请找到以下两种使用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);