使用lambda表达式计算数组中的差异

时间:2015-06-17 14:12:01

标签: java arrays lambda

我正在尝试执行以下操作:如果我有一个数组数字,其中包含数字

{1,4,9,16,25,36,49,64,81,100}

我想递归计算两个后续元素之间的差异。首先在元素10之间,然后是2 and 1等。

一旦我有这些差异,我想计算 数组中任意两个后续元素之间的差异。

所以,如果你从

开始
{1,4,9,16,25,36,49,64,81,100}

你去

{3,5,7,9,11,13,15,17,19}

然后到

{2,2,2,2,2,2,2,2}

我知道如何对此进行编程,但仅限于Java 7样式而不是Java 8 Lambda表达式样式。这是我的尝试:

    Integer[] numbers = new Integer[] {1,4,9,16,25,36,49,64,81,100};
    for (int i=0;i<3;i++)
    {
        int length = numbers.length;
        numbers = IntStream.range(1, length)
                .mapToObj(a->numbers[a]-numbers[a-1])
                .toArray(b->new Integer[length-1]);
    }

这不起作用,因为Java在使用lambda表达式时要求数组编号为final,但是我不能在同一个数组上递归调用相同的代码。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如何为你做一个UnaryOperator,那么你可以传入数组并使用它来计算新数组,同时保持lambda中使用的变量实际上是最终的:

int numbers[] = new int[] {1, 4, 9, 16, 25, 36, 49, 64, 81, 100};
UnaryOperator<Integer[]> differenceFunc = ns -> IntStream.range(1, ns.length)
    .map(i -> ns[i] - ns[i - 1])
    .toArray();
for (int x = 0; x < 3; ++x) {
    numbers = difference.apply(numbers);
}

答案 1 :(得分:-1)

您可以使用Stream.iterate从中应用“减量”功能。您跳过前面的第x个元素来获取所需的数组(可能不是最佳方法),或者您可以将其限制为x调用并将数组收集到列表中,例如:

int[] numbers = {1,4,9,16,25,36,49,64,81,100};

Optional<int[]> opt =
    Stream.iterate(numbers, arr -> IntStream.range(1, arr.length)
                                            .map(i -> arr[i] - arr[i-1])
                                            .toArray())
          .skip(2)
          .findFirst();

opt.ifPresent(a -> System.out.println(Arrays.toString(a)));

例如:

skip 0 => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 
skip 1 => [3, 5, 7, 9, 11, 13, 15, 17, 19]
skip 2 => [2, 2, 2, 2, 2, 2, 2, 2]
skip 3 => [0, 0, 0, 0, 0, 0, 0]