如何在Java中使用函数输入调用方法?

时间:2019-01-17 18:21:29

标签: java function methods

我有一个具有以下功能的类:

public class Entity{
      public void apply(final Function<Item, Item> function) {}
}

如何用这种方法拨打电话?

示例:

Entity entity = new Entity();
entity.apply( ??? );

3 个答案:

答案 0 :(得分:1)

您需要传递一个Function<Item, Item>的函数,该函数需要一个Item并返回一个Item,假设您有一个类似

的方法
class Item {
    Item doThis() {
        return this;
    }
}

您将能够做到:

Function<Item, Item> fct = itm -> itm.doThis();
entity.apply(fct);

哪个是lambda形式的

Function<Item, Item> fct2 = new Function<Item, Item>() {
    @Override
    public Item apply(Item item) {
        return item.doThis();
    }
};
entity.apply(fct);

答案 1 :(得分:1)

可能可以使用Consumer<?>

public class Entity{
    void consumingMethod(Consumer<Object> consumer) {
        consumer.accept(this::methodToConsume)
    }

    void methodToConsume(Object o){
        ....
    }
}

Object可以替换为特定类型,我使用了几种类型,而Object最适合我

答案 2 :(得分:1)

您正在使用Java中所谓的“泛型”。泛型有助于多态(如您所知),因为它可以在不同的上下文中采用不同的“类型”,具体取决于您希望这些类型是什么。因此,在您的示例中,您可以将一个Object传递给该方法,该方法包含您想要泛型成为的任何类型。这是您的通用类型(函数)作为类的示例:

public class Function<T, I> {

}

由于此类型采用类型(T和I),因此在Java中实质上是“映射”。下面是如何创建函数类型的对象的示例:

Function<Integer, String> function = new Function<Integer, String>();

这是将这个对象传递给函数的方法:

apply(function);

请注意,您可能需要在Function类中为要用于此泛型的Wrappers的值创建一个构造函数。下面是您的apply方法定义的样子(它不需要是静态的,在创建伪代码时我只是为了简化起见。它可以是您的“实例”(非静态)方法提到):

public static void apply(Function f) {

}