Lambda表达式——java8的新特性
Lambda表达式:允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理。
讲之前先引入一个概念叫函数编程,这个对于用过c#,Python的同学来讲应该不陌生,但是对于学java的同学来讲还是很陌生的。自java8开始正式支持函数编程。正如c#之父所讲,未来编程语言将逐渐融合各自的特性,而不存在单纯的声明式语言(如之前的Java)或者单纯的函数编程语言。将来声明式编程语言借鉴寒暑编程思想,函数编程语言融合声明式语言。。。这几乎是一种必然趋势。
本文将用例子的方式来告诉你,为什么要Lambda表达式。(!!!并且可以顺带学一下设计模式之策略模式!!!),原因如下:
(1)内部循环和外部循环
- List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
- for (int number : numbers) {
- System.out.println(number);
- }
1、只能顺序处理list中的元素
2、不能充分利用多核CPU
3、不利于编译器优化
下面看看内部循环
- List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
- numbers.forEach((Integer value) -> System.out.println(value));
1、不一定需要顺序处理List的元素,顺序可以不确定
2、可以并行处理,充分利用多核CPU的优势
3、有利于JIT编译器对代码进行优化。
(2)传递行为,而不仅仅传值
设计以下场景:
public static void print(ArrayList<Integer> list,){
int total = 0;
for (int number : list) {
total += number;
}
System.out.println(total);
}
这个函数的功能就是将list中的元素求和。那么如果我们需要对List中的偶数求和呢?如果需要对其中的三的倍数的元素求和呢?你可能解决的可以再写两个这样的函数实现功能。没错功能可以实现,就是出现了常说的代码重复问题了。那怎么解决,我们可能想到了策略模式,先说说策略模式是个啥?
策略模式:定义一系列算法,把每一个算法封装起来,并且是它们可相互替换,也称为政策模式。策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想是面向对象编程的多形性的思想。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
public class Main {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 10; i++){
list.add(i);
}
ContextClass context = new ContextClass(new SumAllEvent());
context.print(list);
}
}
interface Strategy {
public boolean test(int sum);
}
class SumAll implements Strategy {
public boolean test (int num) {
return true;
}
}
class SumAllEvent implements Strategy {
public boolean test (int num) {
return num % 2 == 0;
}
}
class ContextClass {
private Strategy s= null;
public ContextClass(Strategy s) {
if(s != null){
this.s = s;
} else {
this.s = new SumAll();
}
}
public void print(List<Integer> numbers) {
int total = 0;
for (int number : numbers) {
if (s.test(number)) {
total += number;
System.out.println(number);
}
}
}
}
OK ,这样就可以实现了,但这是唯一实现的方式吗?当然还有,就是我们的Lambda表达式中的谓词该发生作用了
public class Main {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 10; i++){
list.add(i);
}
print(list,n -> true);
print(list,n -> n % 2 == 0);
print(list,n -> n >3);
}
public static void print(ArrayList<Integer> list, Predicate<Integer> p){
int total = 0;
for (int number : list) {
if (p.test(number)) {
total += number;
}
}
System.out.println(total);
}
}
同样实现了策略模式的功能,但是你能发现代码量减少了很多,真的很多,还不用定义那么多类,多好啊!
综上:Lambda表达式还是要好好掌握滴,功能还有很多,就不一一举例啦!祝大家学习愉快!加油!