在@csalmhof的回答上补充一点,我认为这里需要解释一下为什么使用boxed
方法是有效的。
如果您不使用boxed()
方法,而只是简单地编写以下内容:
Map<Integer, String> map = IntStream.range(0, headerDisplayName.length)
.collect(Collectors.toMap(
Function.identity(),
index -> headerDisplayName[index])
);
Java需要将index
作为Object
类型处理,没有隐式转换可用,因此会出现错误。
但是,如果像以下代码中那样使用boxed()
,则不会出现错误:
Map<Integer, String> map = IntStream.range(0, headerDisplayName.length)
.boxed()
.collect(Collectors.toMap(
Function.identity(),
index -> headerDisplayName[index])
);
您之所以没有在这里得到错误,是因为Java将
index
解释为一个
Integer
,并且从
Integer
到
int
进行了隐式转换。一个好的IDE可以帮助你解释这种类型的问题。在IntelliJ中,如果您按下
ctrl
+
space
并将光标放在
index
上(启用Eclipse键映射),则会得到以下结果,不需要使用
boxed()
。
![enter image description here](https://istack.dev59.com/IlS6h.webp)
当您使用了boxed()
后,您将得到以下结果。
![enter image description here](https://istack.dev59.com/TEa0H.webp)
我希望这能澄清为什么使用boxed()
可以避免编译错误。此外,您可以在将来使用此方法查找lambda参数的实际类型,这在某些情况下可能很有用(其中一种情况是OP指出的情况)。
IntStream
没有#collect(Collector)
方法。 - Slaw