Java8函数式接口

370 阅读2分钟

前言

最近在项目中发现了同事写的代码,用到了很多Java8的特性,本篇就写关于函数式接口的;

正文

函数式接口

什么是函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda表达式。Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

函数式接口

可以将lambda表达式作为参数传入方法,并处理;

函数接口注解@FunctionalInterface

该注解主要起一个标记校验作用,在编译时校验该接口是否遵循函数式接口规则; Java 不会强制要求你使用@FunctionalInterface注解来标记你的接口是函数式接口, 然而,作为API作者, 你可能倾向使用@FunctionalInterface指明特定的接口为函数式接口, 这只是一个设计上的考虑, 可以让用户很明显的知道一个接口是函数式接口。

未违反规则:


@FunctionalInterface
public interface TestFunc {
    void test();
}

违反规则:

注解规则

  • 可以定义默认方法

  • 允许定义静态方法

  • 允许定义java.lang.Object里面的public方法

jdk8之前已有的函数式接口

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • ava.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

新定义的函数式接口

集中在java.util.function包下边;

  • Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t)
  • Consumer -- 传入一个参数,无返回值,纯消费。 方法为void accept(T t)
  • Function -- 传入一个参数,返回一个结果,方法为R apply(T t)
  • Supplier -- 无参数传入,返回一个结果,方法为T get()

自定义函数式接口

  1. 自定义函数式接口类:

@FunctionalInterface
public interface AnnotationFunc {
    /**
     * 注释执行方法回调
     */
    void callBack();
}

  1. 使用函数式接口类

public class TestTwo {
    public static void main(String[] args) {
        //赋值函数
        AnnotationFunc annotationFunc=()-> System.out.println("test");
        //调用方法执行
        annotationFunc.callBack();
    }
}

  1. 结果

test
Process finished with exit code 0

总结

这里大概的了解了Java8的函数式编程,可以将函数(lambda表达式)作为参数传递

参考资料