以下代码
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
编译器报错:
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)
有人能解释为什么会出现这种情况吗?
values
是什么,你能包含它的声明吗?另外,关于IntelliJ的建议,似乎不一致。只需在声明和循环之间放置一个打印map
语句即可。它将不再建议您用collect替换。 - NamanCollector
不支持原始类型,这可能是为什么Lambda表达式被转换为Object
的原因,因为boxed()
方法可以解决它。 - Jacob G.