Lambda表达式
如果一个接口只有一个能够代表它的一个抽象方法,那么我们可以使用lambda表达式将这个类的实现表示出来
-
可选类型声明: 无需声明参数类型,编译器即可自动识别
-
可选的参数圆括号: 仅有一个参数时圆括号可以省略
-
可选的大括号:主体只包含一个语句时可省略大括号
-
可选的返回关键字:主体只包含一个表达式返回值并省略大括号时,编译器会自动return返回值;有大括号时,需要显式指定表达式return了一个数值
实现接口方式
interface MathOperation {
int operation(int a, int b);
}
class MathMyOperation implements MathOperation{
@Override
public int operation(int a, int b) {
return a-b;
}
}
public class Java8Tester {
public static void main(String args[]){
// 接口实现类
MathOperation mathOperation0 = new MathMyOperation();
int i1 = mathOperation0.operation(10, 5);
System.out.println(i1);
}
}
匿名实现类方式
interface MathOperation {
int operation(int a, int b);
}
public class Java8Tester {
public static void main(String args[]){
// 匿名实现类
MathOperation mathOperation = new MathOperation() {
@Override
public int operation(int a, int b) {
return a-b;
}
};
int i2 = mathOperation.operation(10,5);
System.out.println(i2);
}
}
Lambda表达式方法
interface MathOperation {
int operation(int a, int b);
}
public class Java8Tester {
public static void main(String args[]){
/**
* Lambda表达式
* 如果一个接口只有一个能够代表它的一个抽象方法,那么我们可以使用lambda表达式将这个类的实现表示出来
*/
MathOperation addition = (a, b) -> a - b;
int i3 = addition.operation(10, 5);
System.out.println(i3);
}
}
参考Lambda表达式的一个规律,我们会发现,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)
// 6. 使用大括号进行返回
(int a, int b) -> {
return a * b; };
传入某个变量到Lambda表达式中时,必须传入常量。即使不是常量,也需要默认为常量,即不可修改的变量。
例
final int c = 10;
MathOperation addition1 = (a, b) -> a - b + c;
int i4 = addition1.operation(10,5);
System.out.println(i4);
Lambda表达式的实质
Lambda表达式它的一些使用方法就如上所示,但是在Lambda表达式的本质其实是将一个抽象接口中的抽象方法当成参数进行传递,达到函数式编程的目的。虽然Lambda表达式将抽象方法当成参数传递,但是传入的参数其实是这个抽象类型的实现类,达到的作用和匿名实现类是一致的。
public class Java8Tes