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

收集要映射的IntStream时出错

巢海
2023-03-14

以下代码

String[] values = ...
.... 
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < values.length; i++) {
    map.put("X" + i, values[i]);
}

由IntelliJ转换为:

Map<String, Object> map = IntStream.range(0, values.length)
        .collect(Collectors.toMap(
                i -> "X" + i,
                i -> values[i],
                (a, b) -> b));

可以缩短为

Map<String, Object> map = IntStream.range(0, values.length)
            .collect(Collectors.toMap(
                    i -> "X" + i,
                    i -> values[i]));

这两个流版本不编译。

IntelliJ,暗示值中的i存在问题[i]:

不兼容的类型
必需:int找到:java。lang.对象

编译器抱怨:

错误:(35,17)java:接口java中的方法collect。util。流动IntStream不能应用于给定类型
必需:java。util。作用供应商,爪哇。util。作用ObjIntConsumer,java。util。作用找到了双消费者:java。util。流动收藏家

有人能解释为什么吗?

共有1个答案

郎磊
2023-03-14

不太确定intelliJ的建议在那里会有什么效果,它似乎不一致。只要放一个

System.out.print(map);

声明和循环之间的语句,然后它不会建议您进一步替换为collect。

使用IntStream collect时,编译失败,原因是实现collect方法需要三个指定的参数在错误中可见,而

Collectors.toMap(i -> "X" + i, i -> values[i])

只会导致收集器类型的单个参数。

转换表达式的更好方法

>

  • 要么使用foreach

    Map<String, Object> map;
    IntStream.range(0, values.length).forEach(i -> map.put("X" + i, values[i]));
    

    或者使用box()IntStream转换为Stream

    Map<String, Object> map = IntStream.range(0, values.length).boxed()
               .collect(Collectors.toMap(i -> "X" + i, i -> values[i], (a, b) -> b));
    

    或者正如@Holger所建议的,您可以避免使用forEach和装箱开销,并修改构造以使用IntStream。将三个参数变量收集为:-

    Map<String, Object> map = IntStream.range(0, values.length)
               .collect(HashMap::new, (m,i) -> m.put("X"+i,values[i]), Map::putAll);
    

  •  类似资料:
    • 我有这个代码: 它产生的是 很高兴我应该如何写映射方法来得到一个地图,它会给我:

    • 我有一小段代码,用于计算给定数组中的正值、负值和零值的数量。使用Java 7,通过迭代数组并计算正值、负值和零值的数量,我可以轻松地做到这一点。但对于Java 8流,在map函数中写入条件是否正确?目前,此代码只迭代一次,并跳过数组的其余值。

    • 我想从的中创建一个并在映射中使用相同的parentId映射列表中的所有条目,如。 我使用了但它不编译:

    • 我对构建哈夫曼编码原型感兴趣。为此,我想首先生成一个组成输入Java字符串的字符直方图。我在SO和其他地方看到了许多解决方案(例如:这里依赖于使用流的方法以及函数的静态导入。identity()和收集器。以非常具体和直观的方式计数()。 但是,当使用与我上面链接的代码非常相似的一段代码时: 我从Intellij收到一个编译时错误,它告诉我没有符合供应商类型的参数来收集,这是其签名所要求的: 不幸的

    • 假设你有一张这样的物体地图(尽管想象它更大): rtype=133,有两个! 我想对Streams做的是这样的: 我在理解Collectors&groupBy的工作原理时遇到了一些麻烦,但我想这可能会用于本例。 在Java streams API中进行编码的正确方法是什么? 我很难找到类似的地图例子(人们在他们的例子中更多地使用列表)