Java8 Lambda表达式

来源:互联网 发布:启航电商网络平台兼职 编辑:程序博客网 时间:2024/05/17 07:48

Lambda表达式——java8的新特性

Lambda表达式:允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理。

讲之前先引入一个概念叫函数编程,这个对于用过c#,Python的同学来讲应该不陌生,但是对于学java的同学来讲还是很陌生的。自java8开始正式支持函数编程。正如c#之父所讲,未来编程语言将逐渐融合各自的特性,而不存在单纯的声明式语言(如之前的Java)或者单纯的函数编程语言。将来声明式编程语言借鉴寒暑编程思想,函数编程语言融合声明式语言。。。这几乎是一种必然趋势。


本文将用例子的方式来告诉你,为什么要Lambda表达式。(!!!并且可以顺带学一下设计模式之策略模式!!!),原因如下:

(1)内部循环和外部循环


  1. List<Integer> numbers = Arrays.asList(123456);  
  2.  
  3. for (int number : numbers) {  
  4.     System.out.println(number);  
  5. }
这个叫外部循环,简单说一下外部循环的三个缺点:

1、只能顺序处理list中的元素

2、不能充分利用多核CPU

3、不利于编译器优化

下面看看内部循环

  1. List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);  
  2.  
  3. 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表达式还是要好好掌握滴,功能还有很多,就不一一举例啦!祝大家学习愉快!加油!


原创粉丝点击