我正在尝试执行以下操作:如果我有一个数组数字,其中包含数字
{1,4,9,16,25,36,49,64,81,100}
我想递归计算两个后续元素之间的差异。首先在元素1
和0
之间,然后是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,但是我不能在同一个数组上递归调用相同的代码。我该如何解决这个问题?
答案 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]