前言:最近看技术博文,关于if..else过多的情况,在以前的解决方案一般是用策略模式,但是这篇博文给了个新的思路,利用Java 8 Lambda 表达式加上Map与函数式接口来实现优美的解决思路。那么问题来了,什么是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 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!
}
}
本文参考博文:
Java8 新特性 之 函数式接口——https://blog.csdn.net/qinchao_mei/article/details/97649152
Java 8 Lambda 表达式 | 菜鸟教程——https://www.runoob.com/java/java8-lambda-expressions.html