从Java 8中的Double流中收集Long的列表

aldrael:

我有以下代码:

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>因此,为了能够收集它们,我们首先需要将这些基本元素装箱longLong对象中:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章