当前位置: 首页 > 知识库问答 >
问题:

如何使用Stream-Java8将列表转换为带索引的映射?

姜胤
2023-03-14

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

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;
}

共有1个答案

邵伟
2023-03-14

避免像其他答案中提供的基于AtomicInteger解决方案那样的有状态索引计数器。如果流是并行的,它们就会失败。而是通过索引进行流式传输:

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

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

 类似资料:
  • 我正在尝试学习如何使用Java 8的集合,我想知道是否有一种方法将我的列表转换成一个地图使用Java流。 我想知道如何使用流将上面的列表创建到一个映射中。我知道如何将foreach etc与puts一起使用,但我只是想知道是否有更优雅的方法使用流构建映射。(我知道下面的语法不正确,我是流的新手,不知道怎么写) 目标是代表以下内容。

  • 我正在查看的文档,我看到了方法,但无法直接转到 是否有方法将转换为?

  • 我想把列表转换成地图使用作为关键值只有两个字符串值。然后作为值,从输入列表中只列出包含奇数或偶数索引位置的元素的字符串列表。以下是旧的时尚代码: 如何使用流将此代码转换为Java8以获得此结果? 我目前的混乱尝试需要修改列表的元素,但肯定是更好的选择。 或者也许有人帮我解决这个不正确的问题? 返回以下内容:

  • 我的索引: 我必须将此格式转换为以下格式的列表:

  • 我有一个问题与转换列表对象映射字符串,列表对象。我正在寻找与一个关键名称的汽车所有组件的地图,一个值由汽车与此组件表示 我写了一个解决方案,但寻找一个更好的流解决方案。