java8流样式将键值列表转换为映射?

时间:2017-02-15 17:18:59

标签: functional-programming java-8 java-stream

我想将像[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流式?怎么样?

2 个答案:

答案 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()));
相关问题