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

Run*_*Run 5 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}
Run Code Online (Sandbox Code Playgroud)

那我想把它转换成java8流式?怎么样?

JB *_*zet 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}
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您首先通过“boxed”进行管道传输,则可以使用“Collectors.toMap”:“.boxed().collect(Collectors.toMap(i -&gt; (String) params.get(i * 2), i -&gt; params” .get(i * 2 + 1)))` (2认同)