前言:最近看技术博文,关于if..else过多的情况,在以前的解决方案一般是用策略模式,但是这篇博文给了个新的思路,利用Java 8 Lambda 表达式加上Map与函数式接口来实现优美的解决思路。那么问题来了,什么是Lambda 表达式?什么是函数式接口?

一、什么是Lambda 表达式?

先来看几个例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

 我们可以发现,可以把表达式分为三个部分,即->、->左边和->右边。不难看出,->左边为方法接受的参数,->右边为方法的具体实现。以x -> 2 * x  为例,这个方法用以前的写法来表示的话,

private X method(X x){
    return 2*x
}

通过以上的例子,我们可以看见Lambda 表达式的以下重要特性:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

好,Lambda 表达式我们是会看了,那么具体是怎么使用呢?

答案是java提供了给我们很多的基础函数式接口,例如以下案例:

public static void main(String[] args) {
        IntBinaryOperator intBinaryOperator = (x,y) -> x - y;
        System.out.println(intBinaryOperator.applyAsInt(2, 1));  // 1

        Function<String, String> function = (x) -> String.format("hello %s !", x);
        System.out.println(function.apply("world"));  // hello world!
    }

Lambda 表达式构成的函数会返回一个函数式接口,而Lambda 表达式构成的函数就是这个接口的实现了。我们可以查看以下函数式接口的内容:

@FunctionalInterface
public interface IntBinaryOperator {

    /**
     * Applies this operator to the given operands.
     *
     * @param left the first operand
     * @param right the second operand
     * @return the operator result
     */
    int applyAsInt(int left, int right);
}

二、什么是函数式接口?

1、只包含一个抽象方法的接口,称为函数式接口。
2、你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
3、我们可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
4、在java.util.function包下定义了java 8 的丰富的函数式接口

因此,我们自定义函数接口的话,只要加上 @FunctionalInterface 注解,然后满足函数式接口的规范即可,他既可以是接口,也可以是抽象类。

@FunctionalInterface
public interface MyFunctionalInterface {

    String method(String str);

    public static void main(String[] args) {
        MyFunctionalInterface function = (x) -> String.format("hello %s !", x);
        System.out.println(function.method("world"));  // hello world!
    }
}

本文参考博文:


Java 8 Lambda 表达式 | 菜鸟教程——https://www.runoob.com/java/java8-lambda-expressions.html