将一对双精度数转换为双精度数组

5

我收到了以下结构

public class Point {
private final double x;
private final double y;
// imagine required args constructor and getter for both fields
}

现在,我有一个定义了这些点的列表。
List<Point> points = new ArrayList<>();
points.add(new Point(0,0));
points.add(new Point(0,1));
points.add(new Point(0,2));
points.add(new Point(0,3));

数据本身并不重要,只是一些点的列表(上面只是一个简单快速的例子)。

如何以Java 8的方式将此列表转换为double数组(double [] array)


你想要一个数组 0,0,0,1,0,2,0,3 吗?还是一个二维数组? - Blorgbeard
这个数组会是什么样子?是一个包含所有x和y值的一维数组,例如[x,y,x,y...],还是一个长度为2的数组列表? - Jan Gassen
如果顺序是x,y,x,y...等等,那就很好了。所以根据这个例子:0,0,0,1,0,2,0,3 - alexander
4个回答

7
这应该可以解决问题。
points.stream()
      .flatMapToDouble(point -> DoubleStream.of(point.getX(), point.getY()))
      .toArray();

2
好的答案!OP想要一个double[],所以我认为使用flatMapToDouble而不是flatMap是正确的。 - Jacob G.
@pvpkiran 如果有一个方法可以接受一个点并返回一个 DoubleStream,我认为这看起来会更加简洁。总之,这是一个加分项。 - Eugene

0
points.stream().flatMap(p -> Stream.of(p.x, p.y)).toArray(Double[]::new)

0

可以通过反射来实现灵活性。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.DoubleStream;

public class DoubleReflection {

    public static void main(String[] args) throws Exception {
        List<Point> points = new ArrayList<Point>();
        points.add(new Point(10, 11));
        points.add(new Point(12, 13));
        points.add(new Point(14, 15));

        double[] array = points.stream().flatMapToDouble((row) -> {
            Field[] fields = row.getClass().getDeclaredFields();
            return Arrays.stream(fields).flatMapToDouble(field -> {
                try {
                    field.setAccessible(true);
                    return DoubleStream.of(field.getDouble(row));
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace();
                    return null;
                }
            });

        }).toArray();
        System.out.println(Arrays.toString(array));

    }

}

class Point {
    public double a;
    private double b;

    public Point(double a, double b) {
        this.a = a;
        this.b = b;
    }
    public double getB() {
        return b;
    }
}

输出:[10.0,11.0,12.0,13.0,14.0,15.0]

-2

您可以使用Java Streams将每个点映射到一个包含(2)个值的列表,然后将其flatMap成一个值的列表。只要您不介意将它们装箱为Double值。

List<Double> resultList = points.toStream()
  .flatMap( pt -> Arrays.asList( new Double[] { pt.x, pt.y }.toStream() )
  .collect( Collectors.toList() );

3
我没有点踩,但这段代码会出现编译错误(toStream函数不存在)。 - Jacob G.
我同意Jacob的观点。我找不到任何方法来解决这个问题。 - alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接