我们前面介绍介绍的都是使用类实例作为载体,进一步使用类的成员方法和属性。随着近几年函数式编程的大火,JDK8 之后也引入了特性,甚至在以后的 JAVA 框架学习中,你会见到非常多函数式编程的代码。

1. 函数式接口

JAVA 中通过接口实现函数,并添加@FunctionInterface注解(不是必须的,建议加上),并通过匿名内部类来重写add抽象方法,随后便可以使用calculator.add(1, 2)进行调用:

| ```java @FunctionalInterface public interface Function { int add(int i, int j); }

// 右侧输出结果 // calculator.add(1, 2) = 3

  1. <br />> 💡 值得注意的是,函数式接口中只能包含一个方法,否则无法使用箭头函数。
  2. | ```java
  3. public class Calculator {
  4. public static void main(String[] args) {
  5. Function function = new Function() {
  6. @Override
  7. public int add(int i, int j) {
  8. return i + j;
  9. }
  10. };
  11. System.out.println("function.add(1, 2) = "
  12. + function.add(1, 2));
  13. }
  14. }

| | —- | —- |

2. 箭头函数

上述示例,怎么看都还是类方法的调用,而且要写一堆匿名内部类代码的实现逻辑,好像并没有让我们的编程变得更简单。但是,JDK8 之后引入了箭头函数(也称为 Lambda 表达式),上面的代码就会变得极其简单:

| ```java public class Computer { public static void main(String[] args) { Calculator calculator = (i, j) -> {return i + j;}; System.out.println(“calculator.add(1, 2) = “

  1. + calculator.add(1, 2));
  2. }

}

  1. | ```java
  2. public class Computer {
  3. public static void main(String[] args) {
  4. Calculator calculator = (i, j) -> i + j;
  5. System.out.println("calculator.add(1, 2) = "
  6. + calculator.add(1, 2));
  7. }
  8. }

| | —- | —- |

注意:如果方法体内只有一个return语句,可以直接省略不写。

进一步还可以创建一个成员方法,直接接收一个函数参数,写法也是极其简单,尽管非常优雅,但是可读性不是很好。

  1. public class Calculator {
  2. public static void func(Function function) {
  3. System.out.println(function.add(1, 2));
  4. }
  5. public static void main(String[] args) {
  6. func((i, j) -> i + j);
  7. }
  8. }