IntStream rangeClosed无法返回int以外的值

Jul*_*lez 15 java lambda java-8 java-stream

为什么会出错?我以为map可以回报任何价值.

var s = IntStream.rangeClosed(1, 5).map(String::valueOf).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

| 错误:| 不兼容的类型:方法引用中的错误返回类型| java.lang.String无法转换为int | var s = IntStream.rangeClosed(1,5).map(String :: valueOf).collect(Collectors.toList()); |
^ ^ -------------

Era*_*ran 17

使用mapToObj:

var s = IntStream.rangeClosed(1, 5).mapToObj(String::valueOf).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

地图IntStream只能映射一个int到另一个值int的值.它接受一个IntUnaryOperator(接受int并返回一个int)作为映射器函数,并返回一个IntStream.

另一方面,mapToObj允许您将int值映射到任何引用类型,从而将其转换IntStream为a Stream<SomeReferenceType>.它接受一个IntFunction<? extends U>(接受int并返回引用类型)作为映射器函数,并返回一个Stream<U>.


Nic*_*s K 6

改为使用mapToObj:

IntStream.rangeClosed(1, 5).mapToObj(String::valueOf).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Ous*_* D. 5

尽管上述答案是正确的,并且mapToObj是继续进行的惯用方法,但我认为重要的是要理解为什么会出现问题,因此在将来的情况下,您将知道如何通过阅读文档来解决问题。

当程序员不了解特定方法的工作原理时,深入研究文档是一项非常重要的技能。

因此,让我们看一下相关的流管道操作:

IntStream.rangeClosedIntStream根据文档返回一个:

以1为增量返回从startInclusive(包括)到endInclusive(包括)的顺序有序IntStream。

调用mapIntStream预计返回一个IntStream按照文件:

返回一个流,该流包括将给定函数应用于此流的元素的结果。

还要注意的是,方法声明map如下:

IntStream map(IntUnaryOperator mapper)
Run Code Online (Sandbox Code Playgroud)

即,它采用一个IntUnaryOperator实际上代表一个具有int值的结果的int值操作数上的操作的

但是,您要传递的函数在我们处理an时String::valueOf会消耗an 并返回 不符合的a ,这就是问题的原因intIntStreamStringIntUnaryOperator

每当您想采用原始流特化并执行某些映射功能并Stream<R>因此产生一个结果时mapToObj,这就是要走的路。

mapToObj 声明为:

mapToObj(IntFunction<? extends U> mapper)

IntFunction表示一个函数,该函数接受一个int值的参数并产生一个结果,并且此结果的类型是类型R,这意味着您将在Stream<R>后面有一个mapToObj