当前位置: 首页 > 面试题库 >

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

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

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


问题答案:

避免使用有状态的索引计数器,如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一起使用,但我只是想知道是否有更优雅的方法使用流构建映射。(我知道下面的语法不正确,我是流的新手,不知道怎么写) 目标是代表以下内容。

  • 我正在尝试创建一个简单的解析util,它转换一个两列CSV文件并将其放入一个映射。 如您所见,我正在创建一个字符串流,用逗号分隔每一行,并将其转换为字符串数组,最后将键映射到索引0,将值映射到索引1。 出于某种原因,当我运行这个测试时,实际值为null。我排除了无效的文件路径,因为它在另一个单元测试中运行良好,并且键值出现在CSV中。我已经盯着它看了几个小时了,我想也许有人能指出我的错误。 此外,

  • 我有我想分批处理的编号列表。

  • 我有以下几门课: 我有一个a的列表,我想将其转换为具有以下逻辑的映射: 在一行流方法中做它的最好方法是什么? 谢谢Elad

  • 我有V类的对象列表,我想创建一个相同V类的新对象。List中对象的一些属性在列表中是相同的,一些属性具有不同的值。我想创建新的对象V,它们具有公共属性,并且具有不同值的属性应该被求和并设置为对象V。 例如 我有如下列表。 我想要新的Sample对象,其值为 我怎样才能做到这一点?