Lambda表达式
1 函数式编程思想概述
在数学中,函数就是有输⼊量、输出量的⼀套计算⽅案,也就是“拿什么东⻄做什么事情”。相对⽽⾔,⾯向对象过分强调“必须通过对象的形式来做事情”,⽽函数式思想则尽量忽略⾯向对象的复杂语法 – 强调做什么,⽽不是以什么形式做。
⾯向对象的思想:
做⼀件事情,找⼀个能解决这个事情的对象,调⽤对象的⽅法,完成事情。
函数式编程思想:
只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程。
2 使用前提
0 JDK8开始引入语法
1.匿名内部类实现接口
2.这个接口是函数式接口: 接口中只有一个抽象方法
@FunctionalInterface 注解
3.作为方法参数使用
3 简化过程
语法: (参数) -> { 要实现的那个方法的方法体 }
例1:
/*
* 匿名内部类: implements Runnable
*/
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
});
代码分析:
1.能确定传的参数类型是Runnable类型
2.能确定实现的方法是 run 方法
简化后:
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});
例2:
Integer[] arr = {8, 23, 17, 10, 2};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(arr));
-
初步简化 -> 匿名内部类 简化成了 lambda 表达式
Arrays.sort(arr, (Integer o1, Integer o2) -> { return o2-o1; });
-
如果方法有参数, 参数类型也可以省略
Arrays.sort(arr, (o1, o2) -> { return o2-o1; });
-
如果方法体中只有一句话, 不论方法中需不需要返回值
return 可以省略
{} 可以省略
; 可以省略
注意: 要省就一起省
最终简化:
Arrays.sort(arr, (o1, o2) -> o2-o1);
例3:
m1(new Koo() {
public int factorial(int n) {
int result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
});
简化成lambda表达式
m1((int n) -> {
int result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
});
第二次简化参数类型
m1((n) -> {
int result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
});
第三次简化: 方法参数只有一个, 可以省略 ()
m1(n -> {
int result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
});
4 省略规则
- ⼩括号内参数的类型可以省略;
- 如果⼩括号内有且仅有⼀个参,则⼩括号可以省略;
- 如果⼤括号内有且仅有⼀个语句,则⽆论是否有返回值,都可以省略⼤括号、return关键字及语句分号。