在 Java 8 中收集 Long from Double Stream 的列表

2022-09-01 05:32:50

我有以下代码:

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());

此代码不起作用,编译错误为:

接口中的方法不能应用于给定的类型;
必需:
找到:
原因:无法推断类型变量(实际参数列表和正式参数列表的长度不同)collectjava.util.stream.LongStreamjava.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

我已经尝试了许多收藏家的用法,但我仍然无法正常工作。我做错了什么?


答案 1

mapToLong为您提供了一个LongStream,该流无法由Collecters.toList收集

这是因为LongStream

基元长值元素序列

我们不能有一个,我们需要一个.因此,为了能够收集它们,我们首先需要将这些基元s打包到对象中:List<long>List<Long>longLong

list.stream().map(i -> i * 2.5)
    .mapToLong(Double::doubleToRawLongBits)
    .boxed()                                //< I added this line
    .collect(Collectors.toList());

盒装方法为我们提供了一个能够收集到列表中的方法。Stream<Long>

使用 map 而不是 也有效,因为这将导致值自动装箱:mapToLongSteam<Long>

list.stream().map(i -> i * 2.5)
    .map(Double::doubleToRawLongBits)
    .collect(Collectors.toList());

答案 2

如果使用 而不是 ,则应编译。(我不确定你试图做什么是否有任何意义,但这至少会编译。mapmapToLongdoubleToRawLongBits


推荐