据我所知,Java中的函数式接口必须有一个(且只有一个)抽象方法。然而,
selectDSLCompleter
中名为org.mybatis.dynamic.sql.select
的接口没有任何抽象方法,但仍然可以正常工作。
接口定义如下:
package org.mybatis.dynamic.sql.select;
import java.util.function.Function;
import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.util.Buildable;
@FunctionalInterface
public interface SelectDSLCompleter extends Function<QueryExpressionDSL<SelectModel>, Buildable<SelectModel>> {
static SelectDSLCompleter allRows(){
return (c) -> {
return c;
};
}
static SelectDSLCompleter allRowsOrderedBy(SortSpecification... columns) {
return (c) -> {
return c.orderBy(columns);
};
}
}
并用作此示例:
映射器中定义的方法:
default List<Person> select(SelectDSLCompleter completer) {
return MyBatis3Utils.selectList(this::selectMany, selectList, person, completer);
}
服务中调用的方法:
List<Person> allRecords = mapper.select(c -> c);
有什么我错过的吗?
我搜索了这个问题,但什么也没找到。我只是想知道它是如何工作的。
它确实包含一个抽象方法。它继承自
Function<QueryExpressionDSL<SelectModel>, Buildable<SelectModel>>