是否可以在Java中执行类似的操作
private ? /* (I dont know what Class to use) */ shortcutToMethod = redundantMethod(game.getGraphics());
因此,您不必致电redundantMethod(game.getGraphics().doThisMethod());
我可以做shortCutToMethod.doThisMethod();
这可能吗?
答案 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)。