美文网首页JAVA相关
函数式接口@FunctionalInterface

函数式接口@FunctionalInterface

作者: hei禹 | 来源:发表于2018-07-22 15:59 被阅读0次

    什么是函数式接口

    所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

    这种类型的接口也称为SAM接口,即Single Abstract Method interfaces

    特点

    • 接口有且仅有一个抽象方法
    • 允许定义静态方法
    • 允许定义默认方法
    • 允许java.lang.Object中的public方法
    • 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错

    例子

    // 正确的函数式接口
    @FunctionalInterface
    public interface TestInterface {
     
        // 抽象方法
        public void sub();
     
        // java.lang.Object中的public方法
        public boolean equals(Object var1);
     
        // 默认方法
        public default void defaultMethod(){
        
        }
     
        // 静态方法
        public static void staticMethod(){
     
        }
    }
    
    // 错误的函数式接口(有多个抽象方法)
    @FunctionalInterface
    public interface TestInterface2 {
    
        void add();
        
        void sub();
    }
    
    

    用法

    1. Runnable的用法
    2. 公司组内的用法介绍
    /**
     * 真正的业务处理
     */
    @FunctionalInterface
    public static interface RequestExecutor {
        Object doExecute() throws BusinessException;
    }
    
    /**
     * 请求模板
     */
    public void templateRequest(RequestExecutor executor) {
        // 获取response对象
        HttpServletResponse response =
            ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        
        try {
            
            Object result = executor.doExecute();
            writeAjaxJSONResponse(ResultMessageBuilder.build(true, "success!", result), response);
            
        } catch (Exception e) {
        
            logger.error("请求失败", e);
            writeAjaxJSONResponse(ResultMessageBuilder.build(false, 500, "系统异常"), response);
            
        }
    }
    
    /**
     * controller部分代码
     */
    @PostMapping(path = "/pageQuery")
    public void pageQuery(@RequestBody Query query) {
        templateRequest(() -> service.pageQuery(query));
    }
    
    /**
     * service部分代码
     */
    public PagedResult<VO> pageQuery(Query query);
    

    JDK中的函数式接口举例

    java.lang.Runnable,

    java.awt.event.ActionListener,

    java.util.Comparator,

    java.util.concurrent.Callable

    java.util.function包下的接口,如Consumer、Predicate、Supplier等

    相关文章

    参考资料

    相关文章

      网友评论

        本文标题:函数式接口@FunctionalInterface

        本文链接:https://www.haomeiwen.com/subject/xjolmftx.html