函数式接口和@FunctionalInterface

函数式接口的特点

  • 接口有且仅有一个抽象方法
  • 允许定义静态方法和默认方法(这两个都不是抽象方法)
  • 允许java.lang.Object中的public方法(因为任何一个函数式接口的实现,默认都继承了Object类)
  • 添加@FunctionInterface注解会让编译器检查是否符合函数式接口的约束规范,但不是必须添加。没有添加时,只要符合以上规范也认为是一个函数式接口。
  • 主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

接口类型

Supplier型:无参数、有返回值

Consumer型:有参数、无返回值

Runnable型:无参数、无返回值

Function型:有参数、有返回值

JDK中的函数式方法举例

  • java.lang.Runnable,
  • java.awt.event.ActionListener,
  • java.util.Comparator,
  • java.util.concurrent.Callable
  • java.util.function包下的接口,如Consumer、Predicate、Supplier等

用法举例

1.用来处理异常

先定义一个函数式接口

@FunctionalInterface
public interface ThrowExceptionHandler {

    /**
     * 抛出异常信息
     * @param message
     */
    void throwErrorMessage(String message);
}

再定义处理方法

    public static ThrowExceptionHandler assertsTrue(boolean flag) {
        return (errorMessage) -> {
            if (!flag) {
                throw new RuntimeException(errorMessage);
            }
        };
    }

调用上述方法测试

    assertsTrue(false).throwErrorMessage("抛出异常");

2.用来处理分支

先定义一个函数式接口

@FunctionalInterface
public interface BranchHandler {

    /**
     * 分支判断
     * @param trueHandler
     * @param falseHandler
     */
    void trueOrFalseHandler(Runnable trueHandler, Runnable falseHandler);
}

再定义一个处理方法

   public static BranchHandler isTrueOrFalse(boolean flag) {
        return (trueHandler, falseHandler) -> {
            if (flag) {
                trueHandler.run();
            } else {
                falseHandler.run();
            }
        };
    }

调用上述方法测试

    isTrueOrFalse(true).trueOrFalseHandler(
                () -> { System.out.println("true"); },
                () -> { System.out.println("false"); }
        );
posted @ 2022-05-09 15:11  风小雅  阅读(165)  评论(0编辑  收藏  举报