我想知道在Java 8中使用流来执行以下操作是否有更简洁的方法:
public static double[] multiply(double[][] matrix, double[] vector) { int rows = matrix.length; int columns = matrix[0].length; double[] result = new double[rows]; for (int row = 0; row < rows; row++) { double sum = 0; for (int column = 0; column < columns; column++) { sum += matrix[row][column] * vector[column]; } result[row] = sum; } return result; }
编辑.我收到了一个非常好的答案,但是性能比旧的实现慢了大约10倍,所以我在这里添加测试代码以防有人想要调查它:
@Test public void profile() { long start; long stop; int tenmillion = 10000000; double[] vector = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; double[][] matrix = new double[tenmillion][10]; for (int i = 0; i < tenmillion; i++) { matrix[i] = vector.clone(); } start = System.currentTimeMillis(); multiply(matrix, vector); stop = System.currentTimeMillis(); }
Tunaki.. 7
使用Stream的直接方法如下:
public static double[] multiply(double[][] matrix, double[] vector) { return Arrays.stream(matrix) .mapToDouble(row -> IntStream.range(0, row.length) .mapToDouble(col -> row[col] * vector[col]) .sum() ).toArray(); }
这将创建matrix(Stream
)的每一行的Stream ,然后将每一行映射到使用vector
数组计算产品的double值.
我们必须在索引上使用Stream来计算产品,因为遗憾的是没有内置工具可以将两个Streot压缩在一起.
使用Stream的直接方法如下:
public static double[] multiply(double[][] matrix, double[] vector) { return Arrays.stream(matrix) .mapToDouble(row -> IntStream.range(0, row.length) .mapToDouble(col -> row[col] * vector[col]) .sum() ).toArray(); }
这将创建matrix(Stream
)的每一行的Stream ,然后将每一行映射到使用vector
数组计算产品的double值.
我们必须在索引上使用Stream来计算产品,因为遗憾的是没有内置工具可以将两个Streot压缩在一起.