首页 > 解决方案 > 如何在 Stream Java8 中进行计算操作?

问题描述

是)我有的:

List<String> allGroupsPoint = Arrays.asList(
                "1.0 1.0 1.0 4.0 5.0 4.0 5.0 1.0",
                "1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0",
                "1.0 1.0 1.0 4.0 5.0 4.0 5.0 1.0");

第 1 步:需要通过我的方法将所有字符串从转换List<String> allGroupsPoint为。第 2 步: 我得到每个线阵列:List<Point[]> arrayPointsdouble[] dataParser.parse(String s)
double[]

double[] digits = dataParser.parse(String s)

每个数组的大小为 8(因为一个字符串只有 8 个数字)

第 3 步:需要将此数组double转换为 ObjectPoint[]以获取4对象(每 1 个对象 2 个数字)。像这样:

Point p1 = new Point(digits[0], digits[1]);
Point p2 = new Point(digits[2], digits[3]);
Point p3 = new Point(digits[4], digits[5]);
Point p4 = new Point(digits[6], digits[7]);

第 4 步:结束p1, p2, p3, p4to List<Point[] x>

我试过这个,但不起作用:

List<Point[]> test = allGroupsPoint.stream()
                .map(s -> dataParser.parseString(s))
                .map(Point[]::new)
                .collect(Collectors.toList());

我不知道如何在 Stream 中执行STEP 3

标签: javajava-8java-stream

解决方案


试试这个。

List<String> allGroupsPoint = Arrays.asList(
    "1.0 1.0 1.0 4.0 5.0 4.0 5.0 1.0",
    "1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0",
    "1.0 1.0 1.0 4.0 5.0 4.0 5.0 1.0");

List<Point[]> arrayPoints = allGroupsPoint.stream()
    .map(line -> dataParser.parse(line)) // or .map(line -> dataParser.parseString(line))
    .map(array -> IntStream.range(0, array.length / 2)
        .mapToObj(i -> new Point(array[i * 2], array[i * 2 + 1]))
        .toArray(Point[]::new))
    .collect(Collectors.toList());

for (Point[] x : arrayPoints)
    System.out.println(Arrays.toString(x));

输出:

[Point(1.0, 1.0), Point(1.0, 4.0), Point(5.0, 4.0), Point(5.0, 1.0)]
[Point(1.0, 2.0), Point(3.0, 4.0), Point(5.0, 6.0), Point(7.0, 8.0)]
[Point(1.0, 1.0), Point(1.0, 4.0), Point(5.0, 4.0), Point(5.0, 1.0)]

推荐阅读