语法
lambda表达式最明显的就是 “->” 符号;
例:
/**
* parameters 可看作参数;
* -> 后的 expression 可看作方法体(处理逻辑)
* -> 后的方法体如果只包含有一个处理语句,可不用写打括号 {};
*/
(parameters) -> expression;
/**
* 若方法体中有多条处理语句,则需要将多条处理语句放入大括号中;
*/
(parameters) -> {
expression1;
expression2;
……
}
在Java 8 的lambda表达式中,不仅方法体的大括号可以省略(在只有一条处理语句时),还有很多其他的重要特性;
- 可选的参数小括号
如果参数只有一个时,参数的小括号可忽略不写
parameters -> expression;
- 可选的参数类型声明
在Java7之前的语法,参数是需要声明类型的,但是在Java8的lambda表达式中,参数有时不需要声明类型,因为lambda表达式会通过上下文来判断参数的类型是什么;
Comparator<Integer> c = (Integer x, Integer y) -> x + y;
// 上面的代码也可以利用lambda的 可选参数类型声明的特性,将参数的类型忽略不写;
Comparator<Integer> c = (x, y) -> x + y;
上面这两行代码其实表达的内容是一样的。
函数式接口
lambda表达式可实现的前提就是函数式接口,上文提到的Comparator<T>就是一个函数式接口;
Comparator<T>接口
从上图可看出,在这个接口上有一个信息的注释 @FunctionalInterface,这个@FunctionalInterface注释就是用来声明函数式接口的(当然也可以不加@FunctionalInterface注解,但是为了代码规范和可读性,只要是函数式接口就需要@FunctionalInterface注解来声明)。
Java 8 还新增了很多函数式接口。
写一个自己的函数式接口
通过上文知道,函数式接口需要通过@FunctionalInterface来声明;
// 声明此接口为函数式接口
@FunctionalInterface
public interface MathOperation {
int operation(int x, int y);
}
// 这是一个简单的函数式接口
如何使用自己的函数式接口
MathOperation addOperation = (x, y) -> x + y;
System.out.println("x + y = " + addOperation.operation(2, 2));
// 输出结果为:x + y = 4
一开始的时候我看这里也是云里雾里的,但是看一下用非lambda语法来实现的代码就会清楚很多:
// 这川代码等同于上面👆代码,是不是就清晰了很多。。。
System.out.println("x + y =" + new MathOperation() {
@Override
public int operation(int x, int y) {
return x + y;
}
}.operation(2,2));
其实Java 8 新特性 lambda表达式还有很多东西,我所写的内容也不完全对。
参考:https://www.runoob.com/java/java8-lambda-expressions.html
网友评论