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