如何从流中收集双打列表?
How to collect a list of doubles from a stream?
假设我希望从 lambda 函数中收集 double[] 的列表,我创建了以下示例,但是在给定类型的情况下它无法编译。我可以做些什么作为解决方法?
public class CollectingStreams {
public static double [] methodReturnArray(int n){
return new double[] {1*n,2*n};
}
public static void main(String[] args){
List<double[]> listArray= IntStream.range(0,5).parallel().forEach(
(n) -> {methodReturnArray(n).collect(Collectors.toList());
});
}
}
这里是编译错误:
java: cannot find symbol
symbol: method collect(java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>)
location: class double[]
作为尝试,我尝试了以下方法
List<double[]> listArray= IntStream.range(0,5).parallel().forEach(
(n) -> {
Arrays.stream(methodReturnArray(n)).collect(Collectors.toList());
});
但是提示这个编译错误:
java: method collect in interface java.util.stream.DoubleStream cannot be applied to given types;
required: java.util.function.Supplier<R>,java.util.function.ObjDoubleConsumer<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)
此外,我已经看到(这里)[https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html] 最好避免数组有利于收集到列表的副作用,因此我必须小心使用数组。
我不确定如何正确投射或修改我的尝试,以便收集我的 double[] 列表。
有什么想法吗?
谢谢
而不是 .forEach()
使用 .mapToObject()
,因为 forEach 没有 return 任何可以进一步处理的东西。
这是我要尝试的代码:
List<double[]> listArray = IntStream.range(0,5)
.mapToObj(CollectingStreams::methodReturnArray)
.collect(Collectors.toList());
List<int> numbers = new ArrayList<>();
List<double> numbers.stream().map(number -> (double) number).toList();
您不需要 return 数组的方法。你可以这样做。
List<double[]> listArray= IntStream.range(0,5)
.mapToObj(i->new double[]{i*1, i*2})
.toList();
listArray.forEach(s->System.out.println(Arrays.toString(s)));
打印
[0.0, 0.0]
[1.0, 2.0]
[2.0, 4.0]
[3.0, 6.0]
[4.0, 8.0]
假设我希望从 lambda 函数中收集 double[] 的列表,我创建了以下示例,但是在给定类型的情况下它无法编译。我可以做些什么作为解决方法?
public class CollectingStreams {
public static double [] methodReturnArray(int n){
return new double[] {1*n,2*n};
}
public static void main(String[] args){
List<double[]> listArray= IntStream.range(0,5).parallel().forEach(
(n) -> {methodReturnArray(n).collect(Collectors.toList());
});
}
}
这里是编译错误:
java: cannot find symbol
symbol: method collect(java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>)
location: class double[]
作为尝试,我尝试了以下方法
List<double[]> listArray= IntStream.range(0,5).parallel().forEach(
(n) -> {
Arrays.stream(methodReturnArray(n)).collect(Collectors.toList());
});
但是提示这个编译错误:
java: method collect in interface java.util.stream.DoubleStream cannot be applied to given types;
required: java.util.function.Supplier<R>,java.util.function.ObjDoubleConsumer<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)
此外,我已经看到(这里)[https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html] 最好避免数组有利于收集到列表的副作用,因此我必须小心使用数组。
我不确定如何正确投射或修改我的尝试,以便收集我的 double[] 列表。
有什么想法吗?
谢谢
而不是 .forEach()
使用 .mapToObject()
,因为 forEach 没有 return 任何可以进一步处理的东西。
这是我要尝试的代码:
List<double[]> listArray = IntStream.range(0,5)
.mapToObj(CollectingStreams::methodReturnArray)
.collect(Collectors.toList());
List<int> numbers = new ArrayList<>();
List<double> numbers.stream().map(number -> (double) number).toList();
您不需要 return 数组的方法。你可以这样做。
List<double[]> listArray= IntStream.range(0,5)
.mapToObj(i->new double[]{i*1, i*2})
.toList();
listArray.forEach(s->System.out.println(Arrays.toString(s)));
打印
[0.0, 0.0]
[1.0, 2.0]
[2.0, 4.0]
[3.0, 6.0]
[4.0, 8.0]