我想将像[k1,v1,k2,v2]这样的列表转换为像{k1:v1,k2:v2}这样的地图。原始代码是:
List<Object> params = Arrays.asList("k1", "v1", "k2", "v2");
Map<String, Object> map = new HashMap<>();
for(int i = 0; i < params.size(); i+=2) {
String key = (String)params.get(i);
Object value = params.get(i + 1);
map.put(key, value);
}
System.out.println(map); // => {k1=v1, k2=v2}
然后我想将它转换为java8流式?怎么样?
答案 0 :(得分:2)
你可以使用它,但坦率地说,你的for循环更具可读性。我会尽量避免产生这样的列表,而是改为List<SomePair>
,其中SomePair
包含密钥和值。
List<Object> params = Arrays.asList("k1", "v1", "k2", "v2");
Map<String, Object> map =
IntStream.range(0, params.size() / 2)
.collect(HashMap::new,
(m, i) -> m.put((String) params.get(i * 2), params.get(i * 2 + 1)),
HashMap::putAll);
System.out.println(map); // => {k1=v1, k2=v2}
答案 1 :(得分:2)
除了使用Stream
之外,你可以使用一个好的Iterator
并调用next
来获取下一个元素。当然,如果列表没有偶数个元素,这将失败。
Map<String, Object> map = new HashMap<>();
Iterator<Object> iter = params.iterator();
iter.forEachRemaining(x -> map.put((String) x, iter.next()));