我有以下代码,这些代码使用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 {

}

因此,我的困惑在于main方法的内部:
  • 主要方法的最后一行是updateManager.doUpdateForEach(it, DatabaseOperator::updateInfo);
  • UpdateManager#doUpdateForEach方法需要一个RecordIterator(好的,很有意义)和一个FunctionalStuff
  • FunctionalStuff有一个方法(很明显),它接收2个参数
  • doUpdateForEach的第二个参数是方法引用(DatabaseOperator::updateInfo)
  • DatabaseOperator::updateInfo方法接收单个参数

  • 如何编译? DatabaseOperator::updateInfo方法引用如何转换为功能接口(interface)?我缺少明显的东西吗?还是功能接口(interface)有些特殊情况?

    最佳答案



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

    updateManager.doUpdateForEach(it, (databaseOperator, r) -> databaseOperator.updateInfo(r));
    

    这是匿名类的进一步表示:
    new FunctionalStuff<MyRecord>() {
        @Override
        public void execute(DatabaseOperator databaseOperator, MyRecord r) throws Exception {
            databaseOperator.updateInfo(r);
        }
    });
    

    09-10 12:27