gpt4 book ai didi

java - 收集 IntStream 映射时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:06 24 4
gpt4 key购买 nike

下面的代码

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]));

2 个流版本无法编译。

IntelliJ,提示 values[i] 中的 i 存在问题:

Incompatible types.
Required: int
Found: java.lang.Object

编译器提示:

Error:(35, 17) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
required: java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer
found: java.util.stream.Collector>
reason: cannot infer type-variable(s) R
(actual and formal argument lists differ in length)

谁能解释一下为什么?

最佳答案

不太确定 intelliJ 的建议在那里会如何工作,看起来不一致。放一个

System.out.print(map);

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


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

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

只会产生一个 Collector 类型的参数.


转换表达式的更好方法是

  • 要么使用 forEach

    Map<String, Object> map;
    IntStream.range(0, values.length).forEach(i -> map.put("X" + i, values[i]));
  • 或者使用 boxed() 转换 IntStreamStream<Integer>作为:-

    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.collect三参数变体为:-

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

关于java - 收集 IntStream 映射时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com