【Java8新特性】—lambda 表达式与函数式接口

时间:2021-08-03 19:04:20

前言

    最近学习集合的时候了解到lambda表达式,javaScript-ES6中也使用了箭头函数,有时候也叫lambda 表达式,在js中用(=>)来定义简单的函数,在java中用(—>)符号来表示;不过大家都知道,java和javaScript的关系就像是雷锋和雷峰塔的关系 ,咱们还是来说java中的lambda表达式。

正文

一、什么是Lambda 表达式?
lambda 表达式实际上是一个匿名方法。咱们还是举个例子来说明下:
在没有用lambda表达式之前的方法:

public int add(int x,int y){
   return x + y;
}

用了lambda表达式之后的方法:

//写法一
(int x,int y) -> x + y;
//写法二
(x,y) -> x + y;
//写法三
(x,y) ->{ return x + y;} 
//其它写法

二、lambda表达式的语法
根据上面的写法,可以推测到lambda表达式的组成:
参数列表,箭头(-> ),方法体(一个表达式或语句块)

(parameters) -> expression
或
(parameters) -> {statements;}

说明:

  • 可选类型声明:不声明参数类型也可以,编译器可以统一识别参数值
  • 可选的参数圆括号:一个参数可以不定义圆括号,但是多个参数需要定义圆括号
  • 可选的大括号:如果主体包含了一个语句,可以不使用大括号
  • 可选的返回(return)关键字:如果主体只有一个表达式返回值则编译器会自动返回值,如果使用了return 关键字,则需要加上大括号。
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();

      // 类型声明
      MathOperation addition = (int a, int b) -> a + b;

      // 不用类型声明
      MathOperation subtraction = (a, b) -> a - b;

      // 有大括号,有return 关键字
      MathOperation multiplication = (int a, int b) -> { return a * b; };

      // 没有大括号没有return 关键字
      MathOperation division = (int a, int b) -> a / b;

      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));

      // 参数不用括号
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);

      // 参数用括号
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);

      greetService1.sayMessage("Runoob");
      greetService2.sayMessage("Google");
   }

   interface MathOperation {
      int operation(int a, int b);
   }

   interface GreetingService {
      void sayMessage(String message);
   }

   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}

三、函数式接口
    函数式接口就是显示声明一个接口,这个接口中有且只有一个抽象方法,为了保证抽象方法的数量,java8提供了一个专用注解@FunctionInterface,当接口中声明的方法不为1个时就会报错。

@FunctionalInterface
public interface Test{
    void f1();
}

四、lambda表达式与函数式接口的关系
    对于普通类型的接口,我们想要使用需要定义一个类来实现其中的方法,而函数式接口除了使用普通的方法来实现之外,还支持用lambda表达式来实现。lambda表达式可以理解为是对函数式接口和其中抽象方法的具体实现。 当有一个方法需要函数式接口作为参数时,我们就可以传递一个对应的lambda表达式作为参数,执行的时候就会自动执行函数式接口中的唯一方法。
    举例说明
五、java8 四大核心函数式接口

未完待续。。

总结