意外的Java功能接口转换

ped*_*o91 11 java java-8 functional-interface

我有以下代码,它使用编译的java Functional Interfaces,但不清楚它为什么要编译:

public class App {

    public static void main(String[] args) throws Exception {

        final RecordIterator it = new RecordIterator<MyRecord>();

        final UpdateManager updateManager = new UpdateManager();
        updateManager.doUpdateForEach(it, DatabaseOperator::updateInfo);

    }
}

class UpdateManager {

    public void doUpdateForEach(final RecordIterator recordIterator,
                                final FunctionalStuff<MyRecord> updateAction) throws Exception {

        updateAction.execute(new DatabaseOperator(), new MyRecord());

    }

}

class RecordIterator<E> {

}

@FunctionalInterface
interface FunctionalStuff<T> {

    void execute(final DatabaseOperator database, final T iterator) throws Exception;

}

class DatabaseOperator {

    public void updateInfo(final MyRecord r) {

    }

}

class MyRecord {

}
Run Code Online (Sandbox Code Playgroud)

所以,我的困惑在于main方法:

  • 主要方法的最后一行是 updateManager.doUpdateForEach(it, DatabaseOperator::updateInfo);
  • UpdateManager#doUpdateForEach方法需要一个RecordIterator(确定,有意义),和FunctionalStuff
  • FunctionalStuff 有一个方法(显然),接收2个参数
  • 第二个参数doUpdateForEach是方法引用(DatabaseOperator::updateInfo)
  • DatabaseOperator::updateInfo方法接收单个参数

这是如何编译的?DatabaseOperator::updateInfo方法参考如何转换为功能界面?我错过了一些明显的东西吗 或者是功能接口的一些角落?

Nam*_*man 7

DatabaseOperator::updateInfo方法参考如何转换为功能界面?

方法引用的有效lambda表示形式为:

updateManager.doUpdateForEach(it, (databaseOperator, r) -> databaseOperator.updateInfo(r));
Run Code Online (Sandbox Code Playgroud)

这是匿名类的进一步表示:

new FunctionalStuff<MyRecord>() {
    @Override
    public void execute(DatabaseOperator databaseOperator, MyRecord r) throws Exception {
        databaseOperator.updateInfo(r);
    }
});
Run Code Online (Sandbox Code Playgroud)