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

推荐答案

Java 8 and above

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

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();

并使用method reference syntax使其更干净:

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

Without个lambda表达式,最后两个示例如下所示:

new Thread(new Runnable() { someMethod(); }).start();

Before Java 8

一种常见的模式是将其"包装"到一个接口中,例如Callable,然后传入一个可调用的:

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

这种模式被称为Command Pattern.

请记住,最好为您的特定用途创建一个界面.如果您 Select 使用Callable,那么您可以将上面的T替换为您期望的任何类型的返回值,比如String.

对于你下面的 comments ,你可以说:

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与函数指针的基本概念类似功能.

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

如何在Android上获取来电信息

H2弹簧靴试验跌落台

Spring Batch 5-不要让它在数据库中自动创建表

无法传递消费者<;>;实例

基于调车场算法的科学计算器

SonarLint:只能有条件地调用方法(S)

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

如何从日期中截取时间并将其传递给组件?

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

继续收到错误SQLJDBC EXCEPTION执行";org.springframework.dao.InvalidDataAccessResourceUsageException:&

使用While循环打印素数,无法正常工作

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

JXBrowser是否支持加载Chrome扩展?

如何通过用户ID向用户发送私信

使用同步方法中的新线程调用同步方法

将Optionals/null安全添加到嵌套的flatMap/流

如何使用命令行为Java应用程序生成烟雾测试用例

Vaadin Flow:设置密码显示按钮属性