我有一类带有一堆方法的类。在另一个类中,我需要编写一个方法来处理输入值。对于该方法,我想传递要调用的类的方法。在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));
}
}
}
答案 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
,它在输入中带有两个参数并返回输出。具体来说,它需要两个长数字并因此产生第三个数字。方法的名称保持通用,以便可以涵盖可能发生的不同功能的更多实例。在我们的示例中,我们传递了一个求和和一个乘积函数,如您所见。