【问题标题】:Java 8 List<T> into Map<T, (index)> [duplicate]Java 8 List<T> 到 Map<T, (index)> [重复]
【发布时间】:2016-10-29 12:45:59
【问题描述】:

有没有一种方便的 Java8 流 API 方法可以从 List&lt;T&gt; to Map&lt;T, (index)&gt; 进行转换,如下例所示:

    List<Character> charList = "ABCDE".chars().mapToObj(e->(char)e).collect(Collectors.toList());

    Map<Character, Integer> map = new HashMap<>();
    for (int i = 0; i < charList.size(); i++) {
        map.put(charList.get(i), i);
    }

地图 = {A=0, B=1, C=2, D=3, E=4}

【问题讨论】:

  • Streams API 似乎严重缺少zipWithIndex 操作。
  • 不要认为它是重复的,但您可能会使用这样的收集器:gist.github.com/lyubomyr-shaydariv/…
  • @LyubomyrShaydariv:谢谢,看起来不错,但它比原来的要复杂得多。目标是使其简单易读。
  • @DanielHári 好吧,收集器的实现通常很复杂,但只需编写一次,因此您可以在任何地方使用它们。
  • 在这个问题中,目标是遍历字符串中的字符及其索引。但是 Stream API 没有一个很好的方法来使用带有字符及其索引的 Stream,并且链接的问题显示了如何以通用方式做到这一点:创建一个 IntStream 然后可能调用 mapToObj (或boxed())。

标签: java lambda java-8 java-stream


【解决方案1】:

您可以使用以下讨厌的技巧,但它并不优雅,而且在链表上根本没有效率:

List<String> list = Arrays.asList("a", "b", "c");
Map<String, Integer> result = 
    IntStream.range(0, list.size())
             .boxed()
             .collect(Collectors.toMap(list::get, Function.identity()));

它也比简单的 for 循环 IMO 可读性差。所以我会坚持下去。

【讨论】:

  • 或者完全跳过List&lt;String&gt;,使用原始字符串,其中String::charAt是关键供应商。
  • 抱歉,不够清楚。 List 无关紧要。您可以在任何类型的任何列表中执行此操作。我的回答只关注如何将列表翻译成地图。不在字符串字符上。
  • 我不明白为什么这是一个“讨厌的把戏”。这是基于索引的操作的规范解决方案。
  • @Holger 是的,但是遍历列表不应该是基于索引的操作:在非随机访问列表上效率非常低。不从 list.something() 开始,而是从 Intstream 开始也感觉不自然。
  • 不自​​然的部分是由任务给出的,无论出于何种原因,它都取决于索引。如果任务需要索引,则通过索引进行流式传输与通过元素进行流式传输相比并非不自然。问题始于在 BMP 之外组合字符或代码点,但如前所述,它们已经存在于任务本身中,并且仅由解决方案继承。
猜你喜欢
  • 2014-02-09
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
相关资源
最近更新 更多