我有3种方法可以交换2个变量(基本上是3种不同的算法)。由于您无法在Java中将方法作为参数传递,因此我认为这是使用lambda表达式的好时机。
chooseSwapMethod(int selection) {
if(selection == 1) {
functionThatUsesSwap(
(int[] arr, int x, int y) -> {
int holder = arr[x];
arr[x] = arr[y];
arr[y] = holder;
});
}
else if(selection == 2)
{
functionThatUsesSwap(
(int[] arr, int x, int y) -> {
arr[x] -= arr[y];
arr[y] = arr[x]-arr[y];
arr[x] -= arr[y];
});
}
else if(selection == 3) {
functionThatUsesSwap(
(int[] arr, int x, int y) -> {
arr[x] = arr[x]^arr[y];
arr[y] = arr[y]^arr[x];
arr[x] = arr[x]^arr[y];
});
}
else {
throw new IllegalArgumentEarr[x]ception();
}
}
但在方法functionThatUsesSwap
中,您如何实际使用swap
?我不清楚地理解lambda表达式吗?例如
public void functionThatUsesSwap(Swaper s)
{
int[] someArr = {1, 2};
s.doSwap(someArr, 0, 1);//this is where I’m stuck
System.out.println(“a: “+someArr[0]+” b: “+someArr[1]);//this should print out a: 2 b: 1
}
答案 0 :(得分:3)
Java是按值传递的,这意味着在下面:
int a = 5;
int b = 6;
swap(a,b);
System.out.println(a+" "+b);
功能swap
有 无法 更改a
或b
的值,结果将始终为5 6
。
你能做的是:
有可能性2:
class Pair {
int a, b;
}
@FunctionalInterface
interface Swapper {
void swap(Pair p);
}
void main() {
Pair p = new Pair();
p.a = 5;
p.b = 6;
Swapper swapper = (v -> {
v.a ^= v.b;
v.b ^= v.a;
v.a ^= v.b;
});
swapper.swap(p);
System.out.println(p.a + " " + p.b);
}
结果:6 5
。请注意,您声称you can't pass a method as a parameter in Java
并非完全正确,因为您可以传递接口。
编辑:
还有另一种方法(我之前没有想过这个,因为Interger
类是不可变的)。您可以为整数值创建一个mutable(= changable)对象vrapper,如:
class IntVrapper {
public int value;
}
然后你的swap方法可以在这两个对象之间交换数据。