如何使用流-Java 8将List转换为带有索引的Map?


问题内容

我创建了一种计算字母数字的方法。我正在学习流(函数式编程)并尝试尽可能多地使用它们,但是在这种情况下,我不知道该怎么做:

private Map<Character, Integer> numerateAlphabet(List<Character> alphabet) {
    Map<Character, Integer> m = new HashMap<>();
    for (int i = 0; i < alphabet.size(); i++)
        m.put(alphabet.get(i), i);
    return m;
}

那么,如何使用Java 8流重写它呢?


问题答案:

避免使用有状态的索引计数器,如AtomicInteger其他答案中所述的基于-解决方案。如果流是并行的,它们将失败。相反,流式传输索引:

IntStream.range(0, alphabet.size())
         .boxed()
         .collect(toMap(alphabet::get, i -> i));

上面假设传入列表是字母,因此不应包含重复的字符。如果您有可能重复元素,则多个元素将映射到同一键,然后需要指定合并功能。例如,您可以使用(a,b) -> b(a,b) ->a作为toMap方法的第三个参数。