您可以将方法设置为变量吗?

时间:2019-01-22 07:40:08

标签: java

是否可以在Java中执行类似的操作

private ? /* (I dont know what Class to use) */ shortcutToMethod = redundantMethod(game.getGraphics());

因此,您不必致电redundantMethod(game.getGraphics().doThisMethod());

我可以做shortCutToMethod.doThisMethod();

这可能吗?

4 个答案:

答案 0 :(得分:21)

在Java中,有多种方法。如果您看一下java.util.function软件包,您会看到

  • Function:接受一个论点,产生一个结果
  • Consumer:只接受一个参数,不产生任何结果。
  • BiConsumer:带有两个参数,什么都不产生。
  • Supplier:不带参数,产生一个结果。
  • Predicate:一个自变量的布尔值函数

您可以将它们用作方法的输入并在其中执行。

答案 1 :(得分:18)

Java 8引入了功能接口的概念,该功能接口使您可以从本质上将方法分配给变量。它也包括许多常用的接口。

常见示例:

  • Consumer<T>-接受T并返回void
  • 的方法
  • Function<T, R>-接受T并返回R
  • 的方法
  • Supplier<R>-一种不带参数并返回R
  • 的方法
  • Runnable-一种不带参数并返回void
  • 的方法
  • Predicate<T>-接受T并返回boolean
  • 的方法

就您而言,您似乎在Runnable之后:

Runnable shortcutToMethod = () -> redundantMethod(game.getGraphics());
shortcutToMethod.run();

答案 2 :(得分:2)

您可以使用功能界面。一种功能接口允许人们将一种抽象方法适应于lambda表达式,该表达式又可以存储在变量中,而该方法接近于将方法存储在变量中。

Java中提供了许多功能接口(您可以自己设计其他接口)。例如,如果您的redundantMethod不返回任何内容,则可以使用适合该功能的接口:

private Consumer<Graphics> shortcutToMethod = 
           graphics -> redundantMethod(game.getGraphics());

它甚至可以带有方法参考:

private Consumer<Graphics> shortcutToMethod = this::redundantMethod; //some rules apply

可以通过以下方式调用:

shortcutToMethod.accept(game.getGraphics());

Consumer是Java附带的功能接口之一,它声明了上面调用的抽象方法accept。您可以在java.util.function包中找到其他功能,然后根据您的特定方法具有的签名来选择或编写特定的功能接口。有关更多信息,请参见java.util.function package

答案 3 :(得分:1)

除了其他人已经写的以外。假设returntype为“ Graphics”,这里有4个示例:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod();
}

//here you go and assing your variable
private FunctionDeclaration shortCutToMethod = game.getGraphics()::doThisMethod;
//or you want this - not sure?
// private FunctionDeclaration shortCutToMethod = game::getGraphics;
// and then you just call it:
shortCutToMethod.doThisMethod();

如果要通过图形

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod(Graphics g);
}
//assign your variable
private FunctionDeclaration shortCutToMethod = param -> param.doThisMethod();
//and call it - calls game.getGraphics().doThisMethod()
shortCutToMethod.doThisMethod(game.getGraphics());

如果您的“冗余”方法可以执行以下操作:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod(Graphics g);
}
//assign your variable
private FunctionDeclaration shortCutToMethod = param -> redundantMethod(param.doThisMethod());
//and call it - calls redundantMethod(game.getGraphics().doThisMethod())
shortCutToMethod.doThisMethod(game.getGraphics());

如果您的冗余方法确实在不传递图形的情况下进行了操作:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod();
}
//assign your variable
private FunctionDeclaration shortCutToMethod = () -> redundantMethod(game.getGraphics().doThisMethod());
//and call it - calls redundantMethod(game.getGraphics().doThisMethod())
shortCutToMethod.doThisMethod();

以此类推... 对于前向声明,您当然可以使用任何现有接口,例如Joe和其他提到的预定义接口(例如Supplier)。