我有以下代码:
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());
该代码不起作用,编译错误为:
方法
collect
在接口java.util.stream.LongStream
不能被应用到给定的类型;
必需:java.util.function.Supplier<R>,java.util.function.ObjLongConsumer<R>,java.util.function.BiConsumer<R,R>
发现:java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
原因:无法推断类型变量R
(实际和形式参数列表的长度不同)
我已经尝试过使用Collector的许多方法,但是仍然无法使其正常工作。我究竟做错了什么?
mapToLong
给您一个LongStream
不能被collect
取代的Collectors.toList
。
这是因为LongStream
是
一系列原始长值元素
我们不能有一个List<long>
,我们需要一个List<Long>
。因此,为了能够收集它们,我们首先需要将这些基本元素装箱long
到Long
对象中:
list.stream().map(i -> i * 2.5)
.mapToLong(Double::doubleToRawLongBits)
.boxed() //< I added this line
.collect(Collectors.toList());
该boxed
方法为我们提供了一个Stream<Long>
我们可以收集到列表中的内容。
使用map
而不是mapToLong
也将起作用,因为这将导致Steam<Long>
将值自动装箱:
list.stream().map(i -> i * 2.5)
.map(Double::doubleToRawLongBits)
.collect(Collectors.toList());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句