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而不是mapToLong像Louis Wasserman所建议的那样,也可以使用,因为这会导致Steam<Long>值被自动装箱:
list.stream().map(i -> i * 2.5)
.map(Double::doubleToRawLongBits)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Lou*_*man 15
如果您使用map而不是,则应该编译mapToLong.(我不确定你要做的事情doubleToRawLongBits是否有意义,但这至少会编译.)
不确定您对结果的期望是什么,但这会产生一个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)
| 归档时间: |
|
| 查看次数: |
25808 次 |
| 最近记录: |