我正在研究从数组中找到一对两个整数的问题,该数组以不同的方式总结为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中完成吗?如果答案是肯定的,那么如何?
答案 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)));
}