我有两个列表:
Class Matrix:List<Stroke> stroke = new ArrayList<>();
班级笔划:List<Point2D> points = new ArrayList<>();
points
的每个条目都映射到{x, y, z}
:
points.stream().map(p -> new double[]{p.getX(), p.getY(), 0.0})
每个笔画都会显示double[][]
。
现在我想将stroke
列表转换为double[][]
。
由于每个stroke
给出一个double[][]
,因此需要连接每个数组。
如何使用溪流进行此操作?
stroke.stream()....
答案 0 :(得分:3)
感谢answer的Patrick Parker我知道如何解决这个问题。
我的解决方案看起来像这样:
class Stroke {
List<Point2D> points;
public Stream<double[]> getArrayStream(){
return points.stream().map(p -> new double[]{p.getX(), p.getY(), 0.0});
}
}
class Matrix {
List<Stroke> stroke;
private double[][] getArray() {
return strokeManipulationList.stream()
.flatMap(StrokeManipulation::getArrayStream)
.toArray(double[][]::new);
}
}
如果有关于代码或性能的改进,请随时告诉我。
编辑:
再次感谢Patrick Parker!我替换了
.map(StrokeManipulation::getArrayStream)
.reduce(Stream.empty(), Stream::concat)
只是
.flatMap(StrokeManipulation::getArrayStream)
答案 1 :(得分:1)
我想你想要这样的东西:
class Stroke {
List<Point2D> points;
double[][] toArray() {
return points.stream()
// this part you already knew how to do
.map(p -> new double[]{p.getX(), p.getY(), 0.0})
.toArray(double[][]::new);
}
}
class Matrix {
List<Stroke> stroke;
double[][] toArray() {
return stroke.stream()
.map(Stroke::toArray)
// next we will reduce the stream of double[][] to one...
.reduce(new double[][]{}, (a,b) -> {
// ...by concatenating each double[][] with its neighbor
return Stream.concat(Arrays.stream(a), Arrays.stream(b))
.toArray(double[][]::new);
});
}
}
对于此任务,我选择了终端操作reduce
。有关详细信息,请参阅相关的javadoc。
然而,我想指出,由于您在每个缩减阶段分配一个新阵列,因此效率不高。您可以使用终端操作collect
从可变容器类(例如ArrayList)获得更好的结果。或者,如您所发现的,使用Stream<double[]>
而不是使用任何中间容器的结果更好。