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

ald*_*ael 24 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());
Run Code Online (Sandbox Code Playgroud)

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

方法collect在接口java.util.stream.LongStream不能被应用到给定的类型;
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:无法推断类型变量R (实际和形式参数列表长度不同)

我尝试了许多收藏家的用法,但我仍然无法使其发挥作用.我究竟做错了什么?

Mic*_*ael 43

mapToLong给你一个LongStream不能被collect的人Collectors.toList.

这是因为LongStream

一系列原始的长值元素

我们不能拥有List<long>,我们需要一个List<Long>.因此,为了能够收集它们,我们首先需要将这些原语longs 封装到Long对象中:

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

boxed方法为我们提供了一个Stream<Long>我们能够收集到列表的方法.

使用map而不是mapToLongLouis Wasserman所建议的那样,也可以使用,因为这会导致Steam<Long>值被自动装箱:

list.stream().map(i -> i * 2.5)
    .map(Double::doubleToRawLongBits)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为它帮助我,作为Java 8新手的程序员,理解"_why_".非常感谢! (2认同)

Lou*_*man 15

如果您使用map而不是,则应该编译mapToLong.(我不确定你要做的事情doubleToRawLongBits是否有意义,但这至少会编译.)

  • @aldrael:不。用 `map` 替换 `mapToLong` 工作正常。你试一试。 (2认同)

Old*_*eon 5

不确定您对结果的期望是什么,但这会产生一个List<Long>.

public void test() {
    List<Long> list = new ArrayList<>();
    list.add(4L);
    list.add(92L);
    list.add(100L);
    List<Long> newList = list.stream()
            // Times 1.5.
            .map(i -> i * 2.5)
            // Grab the long bits.
            .mapToLong(Double::doubleToRawLongBits)
            // Box them.
            .boxed()
            // Make a list.
            .collect(Collectors.toList());
    System.out.println(newList);
}
Run Code Online (Sandbox Code Playgroud)

  • `mapToLong(f).boxed()`完全等同于`map(f)`. (3认同)