如何用流连接两个双数组

时间:2016-12-10 17:59:54

标签: java arrays java-8 concatenation java-stream

我有两个列表:

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

2 个答案:

答案 0 :(得分:3)

感谢answerPatrick 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[]>而不是使用任何中间容器的结果更好。