我有以下代码:
List<Long> list = new ArrayList<>();
list.add(4L);
list.add(92L);
list.add(100L);
List<Long> newList = list.stream().map(i -> i * 2.5)
.mapToLong(Double::doubleToRawLongBits)
.collect(Collectors.toList());
此代码不起作用,编译错误是:
接口java.util.stream.LongStream中的方法collect不能应用于给定的类型; required:java.util.function.Supplier <R>,java.util.function.ObjLongConsumer <R>,java.util.function.BiConsumer <R,R> found:java.util.stream.Collector <java.lang . 对象,捕获#1,?,java.util.List <java.lang.Object >> reason:无法推断类型变量R(实际和形式参数列表的长度不同)
我尝试了许多收藏家的用法,但我仍然无法使其发挥作用 . 我究竟做错了什么?
5 回答
如果您使用
map
而不是mapToLong
,则应该编译 . (我不确定你试图用_1749252做什么是有道理的,但这至少会编译 . )mapToLong给你LongStream,collect无法collect .
这是因为
LongStream
是我们不能拥有
List<long>
,我们需要List<Long>
. 因此,为了能够收集它们,我们首先需要将这些原始long
s打包成Long
对象:boxed方法为我们提供了
Stream<Long>
,我们可以将其收集到列表中 .使用map而不是
mapToLong
,正如Louis Wasserman所建议的那样,也会起作用,因为这将导致Steam<Long>
,其中值自动加框:不确定您期望结果如何,但这会产生
List<Long>
.目前尚不清楚为什么要使用
doubleToRawLongBits
. 如果您的问题是与2.5
的乘法产生double
而不是long
,则需要使用类型转换来转换该值,因为doubleToRawLongBits
不是将double
转换为long
的规范方式 . 相反,此方法返回值的IEEE 754表示,这在非常特殊的情况下才有意义 . 请注意,您可以在第一个map
操作中执行转换:如果您真的需要IEEE 754表示
double
值,这甚至适用:但请注意,如果您有一个类型与结果类型匹配的临时列表,您可以就地执行操作,而不是创建两个列表(并通过
Stream
API):再次,即使您想要IEEE 754位,同样适用:
如果您坚持使用
Stream
API,则可以使用构建器而不是ArrayList
作为源数据:这个问题的实质是函数
mapToLong
的返回值是LongStream
接口 .LongStream
只有方法您可能想要使用方法
您可以在java.util.stream.Stream类中找到此方法 .
LongStream
和Stream
没有延伸关系 .