我想要做的是轻松地将实际的方法对象传递给另一个方法。这样我就可以创建一个通用的Joiner函数,该函数连接对象列表的给定方法,而不会只传入表示该方法的字符串。这在Java中是否可行,以便我可以使用如下语法:
joinOnMethod(String, Collections<T>, Method) e.g.
joinOnMethod(", ", someList, T.getName())
T.getName()将getName()方法传递给列表中的每个对象,而不是传入方法本身的返回类型。
希望这足以满足我的需求,
Alexei Blue。
答案 0 :(得分:6)
Java中没有直接的一流功能支持。两个选项:
创建一个包含单个成员的类型,如下所示:
public interface Function<In, Out> {
Out apply(In input);
}
然后你可以使用匿名内部类,如下所示:
joinOnMethod(", ", someList, new Function<T, String>() {
@Override public String apply(T input) {
return input.getName();
}
});
当然,您可以将该函数提取为变量:
private static Function<T, String> NAME_EXTRACTOR =
new Function<T, String>() {
@Override public String apply(T input) {
return input.getName();
}
};
...
joinOnMethod(", ", someList, NAME_EXTRACTOR);
答案 1 :(得分:1)
我建议用Java研究命令模式。它支持回调功能。
答案 2 :(得分:1)
我敢打赌你刚从Javascript或其他将函数视为对象的语言转移到Java。据我所知,这是不可能的,因为Java不会将函数视为对象。你必须在for
循环或其他一些构造中实际写出来。
答案 3 :(得分:1)
不,没有这样的语法。此外,由于类型擦除,实际类型T
在运行时不可用,因此即使语法可用,也不可能在泛型内部。
诀窍是将Class<T>
与其他参数一起传递,并使用反射来获取方法:
joinOnMethod(String separator, Collections<T> items, String methodName, Class<T> theClass)
现在,您可以在类中查询方法methodName
,并在计算中使用该方法。这并没有帮助你摆脱传递字符串(即编译器不会在方法不存在时触发错误),但是你可以使用泛型来处理类型擦除。