如何将方法作为参数传递?

时间:2019-03-14 19:02:28

标签: java methods lambda

我有一类带有一堆方法的类。在另一个类中,我需要编写一个方法来处理输入值。对于该方法,我想传递要调用的类的方法。在1.8之后,如何使用Java做到这一点?

已经存在类似的问题,但是通常会假设我们可以通过一种方法使用接口,因此可以使用lambda表达式等。

class MyClass {
    public Object myToString(String a) {
        return new String(a);
    }

    public Object myToString(String a, String b) {
       return new String(a + ", " + b);
    }

    public Object mySum(int a) {
        return new Integer(a);
    }

    public Object mySum(int a, int b) {
        return new Integer(a + b);
    }
}

class Test {
    public Object handleInputs(MyClass myClass, MethodAsParameter theMethod, List<Object> inputs) {
        if (type of inputs are Strings) {
            myClass.myToString(inputs.get(0));
        } else if (.....) {
            myClass.mySum(inputs.get(0));
        }
    }
}

3 个答案:

答案 0 :(得分:1)

从Java 8开始,您可以使用方法参考。可以将方法引用分配给$ perl -lane ' print if $F[8]=~/([\d.]+)gb/ and $1>10 ' pygo.dat green open fx-syslog-2019.02.12 jbv1mtuET3e8ps2jrJfpjQ 5 1 25964532 0 19.2gb 9.6gb green open dfx-syslog-2019.02.13 EfNnTK1lQNm5-SG3DCSqQw 5 1 13378826 0 15.8gb 7.9gb green open fx-syslog-2019.02.23 WHDwz10jTWibFfKaAdPT0A 5 1 24857467 0 10.6gb 5.3gb green open dfx-syslog-2019.02.12 ZkZKzeUsQJKod_2JDiIOGw 5 1 13203227 0 15.6gb 7.8gb green open dfx-syslog-2019.02.10 -qL7Cz2tTAKNBm8gtS8MZw 5 1 13000846 0 15.2gb 7.6gb green open fx-syslog-2019.02.14 wNMa0id5SkuxnkFdmiG-PA 5 1 19583849 0 14.2gb 7.1gb green open dfx-syslog-2019.02.16 PoFhIj5OTYSsZPxyN4rgsw 5 1 12343056 0 13.4gb 6.7gb green open dfx-syslog-2019.02.11 wivt1yfhT5qhjbgF1Iog_Q 5 1 13223543 0 15.6gb 7.8gb green open dfx-syslog-2019.02.15 azQye17nSpKDnVSSHjVAuw 5 1 13360599 0 15.8gb 7.9gb green open fx-syslog-2019.02.13 BoDbE8XKRUyHI34Xghoq-w 5 1 25967549 0 20.5gb 10.2gb green open dfx-syslog-2019.02.14 7gyTk-XPQ7CdTTmmm54zGw 5 1 14040344 0 16.1gb 8gb $ 功能接口变量及其子类。

例如,具有这种签名的方法:

Function<A, B>
可以将

分配给class Test { public static int DoSomething(String s) {...} } 变量,例如:

Function<String, Integer>

然后调用:

Function<String, Integer> method = Test::DoSomething;

因此,对代码进行少量改进,就可以将方法用作方法引用,并作为参数传递给其他函数。

int result = method.apply("Hello!");

}

答案 1 :(得分:1)

我认为这样就可以了:

import java.util.List;
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.BiFunction;

class MyClass {
    public Object myToString(String a) {
        return new String(a);
    }

    public Object myToString(String a, String b) {
       return new String(a + ", " + b);
    }

    public Object mySum(int a) {
        return Integer.valueOf(a);
    }

    public Object mySum(int a, int b) {
        return Integer.valueOf(a + b);
    }
}

public class MethodParams {
    public static Object handleInputs(Function<Object,Object> method, List<Object> inputs) {
        return method.apply(inputs.get(0));
    }

    public static Object handleInputs(BiFunction<Object,Object,Object> method, List<Object> inputs) {
        return method.apply(inputs.get(0), inputs.get(1));
    }    

    public static void main(String args[]) {
        MyClass mc = new MyClass();

        String str = (String)handleInputs((a) -> mc.myToString((String)a), Arrays.asList("string"));
        System.out.println(str); // string

        Integer sum = (Integer)handleInputs((a) -> mc.mySum((int)a), Arrays.asList(1));
        System.out.println(sum); // 1

        Integer sum2 = (Integer)handleInputs((a,b) -> mc.mySum((int)a, (int)b), Arrays.asList(1, 2));
        System.out.println(sum2); // 3
    }
}

不太好,但是至少在使用哪种方法方面有一些余地。此处演示的代码由于使用对象而具有大量强制转换-使用t2dohx演示的泛型类型是实现此目的的更好方法,但甚至超出您的问题。

答案 2 :(得分:0)

这是一个简单的例子:

public class TestMain {

    public static void main(String [] args) {
        Long a = 15L, b = 20L;
        Long sum = combineTwoNumbers(a, b, (p1, p2) -> p1 + p2);
        Long product = combineTwoNumbers(a, b, (p1, p2) -> p1 * p2);
        System.out.println("Sum is " + sum);
        System.out.println("Product is " + product);
    }

    public static Long combineTwoNumbers(Long a, Long b, BiFunction <Long, Long, Long> combiner) {
        return combiner.apply(a, b);
    }
}

此处,功能参数为BiFunction,它在输入中带有两个参数并返回输出。具体来说,它需要两个长数字并因此产生第三个数字。方法的名称保持通用,以便可以涵盖可能发生的不同功能的更多实例。在我们的示例中,我们传递了一个求和和一个乘积函数,如您所见。