【发布时间】:2017-10-10 13:23:45
【问题描述】:
以下代码
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 存在问题:
不兼容的类型。
必需:int
找到:java.lang.Object
编译器抱怨:
错误:(35, 17) java: 接口 java.util.stream.IntStream 中的方法 collect 不能应用于给定类型;
必需:java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer
找到:java.util.stream.Collector>
原因:无法推断类型变量 R
(实际参数列表和形式参数列表的长度不同)
谁能解释一下原因?
【问题讨论】:
-
values是什么,您能否也包括它的声明。也对 IntelliJ 的建议,似乎不一致。只需在声明和循环之间放置一个 printmap语句。它不会再建议你替换为collect了。 -
String[] 值 = ...
-
我想
Collectors 不支持原语,这可能是 lambda 转换为Object的原因,因为boxed()修复了它。 -
无论如何你都应该向他们提交错误
标签: java intellij-idea java-8 java-stream javac