4

我想要做的是轻松地将实际方法对象传递给另一个方法。这样我就可以创建一个通用的 Joiner 函数,该函数在对象列表的给定方法上进行连接,而无需传入表示该方法的字符串。这在 Java 中是否可行,以便我可以使用如下语法:

joinOnMethod(String, Collections<T>, Method) e.g. 
joinOnMethod(", ", someList, T.getName())

其中 T.getName() 将 getName() 方法传递给列表中的每个对象,而不是传递方法本身的返回类型。

希望这对我的需求足够清楚,

阿列克谢蓝。

4

4 回答 4

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);
    
于 2012-05-18T13:38:21.273 回答
1

我敢打赌,您刚刚从 Javascript 或其他将函数视为对象的语言迁移到 Java。据我所知,这是不可能的,因为 Java 不将函数视为对象。您必须在for循环或其他构造中实际写出它。

于 2012-05-18T13:38:18.177 回答
1

不,没有这样的语法。此外,由于类型擦除,实际类型T在运行时不可用,因此即使语法可用,在泛型中也不可能。

诀窍是与其他参数一起传递Class<T>,并使用反射来获取方法:

joinOnMethod(String separator, Collections<T> items, String methodName, Class<T> theClass)

现在您可以在类中查询方法methodName,并在计算中使用该方法。这并不能帮助您避免传递字符串(即当方法不存在时编译器不会触发错误),但您可以使其与泛型一起使用,尽管类型擦除。

于 2012-05-18T13:38:40.527 回答
1

我建议研究 Java 中的命令模式。它支持回调功能。

http://en.wikipedia.org/wiki/Command_pattern#Java

于 2012-05-18T13:37:16.140 回答