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

标签 java java-8 java-stream

我有以下代码:

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

这段代码不起作用,编译错误是:

method collect in interface java.util.stream.LongStream cannot be applied to given types;
required: java.util.function.Supplier<R>,java.util.function.ObjLongConsumer<R>,java.util.function.BiConsumer<R,R>
found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
reason: cannot infer type-variable(s) R (actual and formal argument lists differ in length)

我已经尝试了很多收集器的用法,但我仍然无法使其工作。 我做错了什么?

最佳答案

mapToLong 给你一个 LongStream 这不可能是 collect -编辑者 Collectors.toList .

这是因为 LongStream

A sequence of primitive long-valued elements

我们不能有 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());

关于java - 从 Java 8 中的 Double 流中收集 Long 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30785278/

相关文章:

java - KeyValueStore 接口(interface)错误

Java从字节数组播放多媒体文件

android - 无法解析com.android.tools.build:gradle:3.0.1;

java - 如何使用 Java 8 中新的 Date-Time API 获取当前时间?

java - Lambda 不解析类型

java - HashMap 迭代/删除获取 java.util.ConcurrentModificationException

java - 时间戳插入到 sql 给我错误

eclipse - Vavr 源 jar 缺少类

java - 我如何获得对象数组 :java8 的值的总和

java - 当出现null时如何用Stream过滤Map?