什么是函数式接口

定义: 有且仅有一个抽象方法的接口

java中有那些函数式接口

四大内置的函数式接口

Consumer,Supply,Funcation,Predicate

其后面会衍生出其他的函数式接口

具体可参考JDK中的java.util.function包

如何自定义函数式接口

1.继承一个函数式接口

2.将接口上加上@FuncationInterface

示例:

/**
* 报表编排
*
* @author Yangqi.Pang
*/
@FunctionalInterface
public interface ReportPipeline extends Consumer<ReportPipeline.ReportContext> {

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ReportContext {
/**
* 报表模板
*/
private ReportTemplate reportTemplate;

/**
* 报表请求参数
*/
private JSONObject reportReq;

/**
* 模板Id
*/
private Long templateId;

/**
* 查询参数Map
*/
private Map<String, Object> fieldMap;

/**
* 返回结果
*/
private List<JSONObject> pageResults;

/**
* 查询类型
*/
private QueryType queryType;

/**
* 参数校验
*/
public void validate() {
ExceptionUtil.validate(Objects.nonNull(templateId), "模板Id不能为空");
ExceptionUtil.validate(Objects.nonNull(reportReq), "传参不能为空");
ExceptionUtil.validate(Objects.nonNull(queryType), "查询类型不能为空");
}

@Getter
@AllArgsConstructor
public enum QueryType {
/**
* 分页查询
*/
PAGE,
/**
* Excel导出
*/
EXCEL_EXPORT
}
}
}

对函数式接口的理解

1.如果我们定义这个类只能做一件事情的时候,我们就可以使用函数式接口,这个就是用来限定这个类的

2.与接口的不同之处就是,接口可以用来做多个事情,没有限制

3.函数式接口独特之处,是要把行为也抽象为一个对象

示例:我们就只定义这个类只能做这一件事情

/**
* 分页查询
*
* @author Yangqi.Pang
*/
@Slf4j
@Component
public class PageQueryPipeline implements ReportPipeline {

@Resource
private ReportMapper reportMapper;

@Override
public void accept(ReportPipeline.ReportContext reportContext) {
ReportTemplate reportTemplate = reportContext.getReportTemplate();
List<JSONObject> results = reportMapper.query(reportTemplate.getSql(), reportContext.getFieldMap());
reportContext.setPageResults(results);
}
}