使用流将String数组转换为Map

时间:2019-04-16 16:39:54

标签: java java-8 java-stream

我有String数组,我想获取Map,其中Integer-是String数组元素的索引。在这种情况下,如何避免使用no instance(s) of type variable(s) T作为地图的钥匙?

AtomicInteger atomicInteger = new AtomicInteger();
String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<Integer, Integer> map = Arrays.stream(a)
            .map(s -> s.replaceAll("\"", "")) // I need to remove '"' from the string
            .collect(Collectors.toMap(o -> o, atomicInteger.getAndIncrement()));

有效的解决方案:

Map<String, Integer> map = IntStream.range(0, a.length) .boxed() .collect(Collectors.toMap(i -> a[i].replaceAll("\"", ""), i -> i));

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的代码中有两个错误:

  1. 您使用的是Map<Integer, Integer>而不是Map<String, Integer>

  2. toMap()需要两个函数作为参数,但是您正在传递值(atomicInteger.getAndIncrement())而不是函数(o -> atomicInteger.getAndIncrement())。

因此完整的示例如下:

AtomicInteger atomicInteger = new AtomicInteger();
String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<String, Integer> map = Arrays.stream(a)
        .map(s -> s.replaceAll("\"", "")) // I need to remove '"' from the string
        .collect(Collectors.toMap(Function.identity(), o -> atomicInteger.getAndIncrement()));

结果是:

{a=0, b=1, c=2}

此外,使用IntStream代替使用AtomicInteger会更好:

String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<String, Integer> map = IntStream.range(0, a.length).boxed()
        .collect(Collectors.toMap(i -> a[i].replaceAll("\"", ""), Function.identity()));