当前位置: 首页 > 面试题库 >

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

谭学名
2023-03-14
问题内容

在Java中,如何将一个函数作为另一个函数的参数传递?


问题答案:

Java 8及以上

如果你的类或接口只有一个抽象方法(有时称为SAM type),则使用Java 8+ lambda表达式,例如:

public interface MyInterface {
    String doSomething(int param1, String param2);
}

然后可以在使用MyInterface的任何地方替换lambda表达式:

class MyClass {
    public MyInterface myInterface = (p1, p2) -> { return p2 + p1; };
}

例如,你可以非常快速地创建一个新线程

new Thread(() -> someMethod()).start();

并使用方法引用语法使其更加清晰:

new Thread(this::someMethod).start();

如果没有 lambda表达式,则最后两个示例将如下所示:

new Thread(new Runnable() { someMethod(); }).start();
在Java 8之前

常见的模式是将其“包装”在接口内Callable,例如,然后传入Callable:

public T myMethod(Callable<T> func) {
    return func.call();
}

此模式称为命令模式。

请记住,最好为你的特定用途创建接口。如果选择与callable一起使用,则将T替换为期望的任何类型的返回值,例如String。

针对下面的评论,你可以说:

public int methodToPass() { 
        // do something
}

public void dansMethod(int i, Callable<Integer> myFunc) {
       // do something
}

然后调用它,也许使用匿名内部类:

dansMethod(100, new Callable<Integer>() {
   public Integer call() {
        return methodToPass();
   }
});

请记住,这不是一个“把戏”。它只是Java的基本概念,等同于函数指针。



 类似资料:
  • 在Python中,我可以很容易地将函数作为参数传递,并在另一个函数内部执行。

  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 假设我们有python中的函数: 虽然我可能会将传递给A,但我正在寻找一种优雅的方法来传递类似于的东西来执行。 我现在看到的唯一方法是发送一个函数列表并按顺序应用它们。有没有更好的办法?

  • 最近我在使用c语言时遇到了一些问题,基本上是这样的: 在一个函数(比如intmain)中,我声明了一个变量Y=5,我有一个lambda函数,它接收一个值并将Y相加; 我的问题是:我需要将这个lambda函数传递给一个已经存在的函数,这样它就可以在另一个函数内部调用。 我尝试了几件事,但没有一个像我预期的那样工作(有些甚至不起作用): 另一个问题是我不能改变我的receives函数签名,因为代码的剩

  • 问题内容: 我想使用数组作为参数调用一个函数: 有路过的内容的一种更好的方式进入? 问题答案: const args = [‘p0’, ‘p1’, ‘p2’]; call_me.apply(this, args); 请参阅MDN文档。 如果环境支持ECMAScript6,则可以改用传播参数:

  • 问题内容: 码: 当我尝试: 我在Eclipse中收到错误。 但当: 一切都好。为什么会有这种差异?谢谢。 问题答案: 因为语法是特殊的语法糖,仅在初始化数组变量时才适用。这是因为任务本身缺少类型信息;但是在赋值的特殊情况下,类型是从变量中完全推断出来的。 在第一个示例中,编译器知道您要分配给它(是),因此允许使用此语法。在后者中,您无需初始化变量(并且由于Java类型推断的弱点,它甚至也无法完全