如何在lambda表达式中调用方法

时间:2014-07-16 23:04:45

标签: java lambda function-pointers java-8

我有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
}

1 个答案:

答案 0 :(得分:3)

Java是按值传递的,这意味着在下面:

int a = 5;
int b = 6;
swap(a,b);
System.out.println(a+" "+b);

功能swap 无法 更改ab的值,结果将始终为5 6

你能做的是:

  1. 将2个数字的数组传递给swap方法,并在该数组中交换数字。
  2. 制作一个班级以容纳2个号码然后通过。
  3. 有可能性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方法可以在这两个对象之间交换数据。