Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用lambda表达式计算数组中的差异_Java_Arrays_Lambda - Fatal编程技术网

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

Java 使用lambda表达式计算数组中的差异,java,arrays,lambda,Java,Arrays,Lambda,我试着做以下的事情:如果我有一个数组,其中包含数字 {1,4,9,16,25,36,49,64,81,100} 我想递归地计算两个后续元素之间的差异。所以首先在元素1和0之间,然后是2和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} 我知道如何编程,但只使用Java7样式,而不使用Java

我试着做以下的事情:如果我有一个数组,其中包含数字

{1,4,9,16,25,36,49,64,81,100}
我想递归地计算两个后续元素之间的差异。所以首先在元素
1
0
之间,然后是
2和
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}
我知道如何编程,但只使用Java7样式,而不使用Java8Lambda表达式样式。这是我的尝试:

    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]);
    }
Integer[]number=新整数[]{1,4,9,16,25,36,49,64,81100};
对于(整数i=0;整数[a]-数[a-1])
.toArray(b->新整数[length-1]);
}

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

如何制作一个为您执行此操作的
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);
}
int number[]=新的int[]{1,4,9,16,25,36,49,64,81,100};
一元运算符differenceFunc=ns->IntStream.range(1,ns.length)
.map(i->ns[i]-ns[i-1])
.toArray();
对于(int x=0;x<3;++x){
数字=差异。应用(数字);
}

您可以使用
流。迭代
,从中应用“减量”函数。您可以跳过前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]
看看