Java 8列表<;T>;进入地图<;T、 (指数)>;

Java 8列表<;T>;进入地图<;T、 (指数)>;,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,是否有一种方便的Java8流API方法可以从列表转换为映射,如以下示例所示: 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

是否有一种方便的Java8流API方法可以从
列表
转换为映射
,如以下示例所示:

    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);
    }
List charList=“ABCDE.chars().mapToObj(e->(char)e).collect(Collectors.toList());
Map Map=newhashmap();
对于(int i=0;i
map={A=0,B=1,C=2,D=3,E=4}


您可以使用以下肮脏的伎俩,但它并不优雅,在链表上也毫无效率:

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()));
List List=Arrays.asList(“a”、“b”、“c”);
映射结果=
IntStream.range(0,list.size())
.boxed()
.collect(Collectors.toMap(list::get,Function.identity());

在我看来,它的可读性也不如简单的for循环。因此我坚持认为。

Streams API似乎严重缺少
zipWithIndex
操作。不要认为它是重复的,但你可以使用这样的收集器:@lyubmyrshaydariv:谢谢,看起来不错,但它比原来的要复杂得多。目标是使其简单易读。@DanielHári收集器实现通常很复杂,但只编写一次,因此您可以在任何地方使用它们。在这个问题中,目标是迭代字符串中的字符及其索引。但是流API并没有一个好的方法来创建一个包含字符及其索引的流,链接的问题展示了如何以通用的方式实现这一点:创建一个
IntStream
,然后调用
mapToObj
(或
boxed()
)。或者完全跳过
列表,使用原始字符串,其中
String::charAt
是关键供应商。抱歉,这还不够清楚。这份清单无关紧要。你可以在任何类型的列表上这样做。我的回答只集中在如何将列表转换为地图上。不是字符串。我不明白为什么这是一个“肮脏的把戏”。这是基于索引的操作的标准解决方案。@Holger是的,但遍历列表不应该是基于索引的操作:在非随机访问列表上,这是非常低效的。如果不是以list.something()开头,而是以Intstream开头,也会让人觉得不自然。不自然的部分是由任务给出的,不管出于什么原因,这取决于索引。如果任务需要索引,则索引上的流与元素上的流相比并不是不自然的。问题开始于组合BMP之外的字符或代码点,但正如所说的,它们已经存在于任务本身中,并且只能由解决方案继承。