使用函数

时间:2017-05-05 17:55:43

标签: java arrays functional-programming java-8

我正在研究从数组中找到一对两个整数的问题,该数组以不同的方式总结为Java中的给定数字。 我想使用Java 8功能。我试过这样的事情:

    for (int i = 0; i < arr.length; i++) {
        List<Integer> res = IntStream.of(arr).boxed().filter(x -> x + arr[i] == givenNumber)
                                .collect(Collectors.toList());
    }

但它不会工作(错误)因为&#34; arr [i]&#34;不是最终的,在我的方法中不可能是最终的。可以像:         过滤器(x - &gt; y - &gt; x + y == givenNumber)用ar和y工作的x和y以某种方式工作?

那么可以使用函数式编程在Java 8中完成吗?如果答案是肯定的,那么如何?

2 个答案:

答案 0 :(得分:4)

可以让他们成为最终的。如果没有别的,你可以写

for (int i = 0; i < arr.length; i++) {
    final int[] arrFinal = arr;
    final int iFinal = i;
    List<Integer> res = IntStream.of(arr).boxed()
        .filter(x -> x + arrFinal[iFinal] == givenNumber)
        .collect(Collectors.toList());
}

虽然我把它写成

for (int i = 0; i < arr.length; i++) {
    int target = givenNumber - arr[i];
    List<Integer> res = IntStream.of(arr).filter(x -> x == target)
                           .boxed().collect(Collectors.toList());
}

...这也清楚地表明,为了它的价值,你只需要重复一次单个值的列表,这可能会首先重塑你的程序。

答案 1 :(得分:2)

这些被称为complementary pairs,只有流可以完成:

 private static void showPairs(int k, int[] array) {

    IntStream.range(0, array.length)
            .boxed()
            .flatMap(i -> IntStream.range(i, array.length)
                    .boxed()
                    .filter(j -> k - array[i] == array[j])
                    .flatMap(j -> Stream.of(new int[] { i, j }, new int[] { j, i }))) // [i, j] and [j, i]
            .forEach(arr -> System.out.println(Arrays.toString(arr)));
}