如何在Java中将作用域作为参数传递?

时间:2018-03-30 00:08:47

标签: java

所以...不完全确定以前是否已经回答过这个问题,虽然我怀疑它已经解决了,而我根本不理解我目前对该语言的了解。因此,稍微进一步的解释可能是好的,我相信这可能是重复的线程是

Java Pass Method as Parameter

我想做的基本想法是这样的:

public void doStuff(String parameter, int parameter, Action/Method/Scope/thing action){
    for(parameters){
        action();
    }
}

会像这样调用:

String parameter1;
int parameter2;
doStuff(parameter1, parameter2){
    action
}

这是非常通用的。很抱歉没有具体的内容。我想到的主要是我一直试图制作一个类似于奥术师(目标)的“炮兵游戏”,或者也许是重力战争(作为一个更近期/更受欢迎的例子)令人讨厌的一点是我经常工作在像素级别编辑图像,因为通用bufferedImage / graphic /无论正常的& GreenfootImage(greenfoot是我正在使用的环境)缺乏我想要的东西。

现在真的很累,请耐心等待我。如果其中一些看起来奇怪的语无伦随意请求澄清,当我打字疲惫时,我并不总是最容易理解。

2 个答案:

答案 0 :(得分:1)

要在Java 8中“传递方法”,您需要匹配的functional interface,即只有一个方法的接口,其参数和返回类型与您要传递的方法相匹配。

您可以使用java.util.function包中的一种标准方法,也可以自己编写。例如。标准接口有各种方法,包括0,1或2个参数。

由于您的参数类型不同,您可以使用BiFunction,或者您可以像这样创建自己的参数:

public interface StringIntConsumer {
    void accept(String s, int i);
}

您现在可以编写代码来接受这样的方法:

public void doStuff(String text, int count, StringIntConsumer action) {
    for (int i = 0; i < count; i++) {
        action.accept(text, i);
    }
}

然后使用Lambda Expression

进行调用
doStuff("Foo", 10, (name, idx) -> {
    // use name and idx here
    // will be called 10 times with idx value 0-9
});

如您所见,参数名称不需要匹配。

答案 1 :(得分:0)

您已经描述了BiFunction<T, U, R>

static <T, U, R> R doStuff(T t, U u, BiFunction<T, U, R> func) {
    return func.apply(t, u);
}

你可以称之为

public static void main(String[] args) {
    System.out.println(doStuff("Hello", 1, (x, y) -> x + " " + y));
}

只打印&#34; Hello 1&#34; - 但不清楚你想做什么动作。