定义: 有且仅有一个抽象方法的接口
四大内置的函数式接口
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); } }