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