What I have: (2 lists)
List<String> keys = Arrays.asList("1", "2", "3");
List<String[]> values = Arrays.asList("a,aa,aaa".split(","), "b,bb,bbb".split(","));
What I'm trying to get: (list of map)
[
{"1": "a", "2": "aa", "3": "aaa"},
{"1": "b", "2": "bb", "3": "bbb"}
]
Java 7 Solution:
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);
}
I'm learning Java 8 and steam. I wonder if it's possible to do it cleaner.
One approach is to iterate over values and then iterate over the indexes of each array, matching them to the corresponding index in 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());
The intermediate boxing is unfortunately necessary in order to use the toMap() collector. If you want to avoid the overhead of boxed indexing, you can define a custom collector in the inner stream:
IntStream.range(0, keys.size())
.collect(HashMap<String, String>::new,
(m, i) -> m.put(keys.get(i), a[i]),
HashMap::putAll)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With