百度百科的解释:java
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式能够表示闭包(注意和数学传统意义上的不一样)。express
基本的语法:api
List<String> lists=Arrays.asList("a","b","c","d"); for (String s:lists){ System.out.println(s); } //1.只能顺序处理List中的元素(process one by one) //2.不能充分利用多核CPU //3.不利于编译器优化 List<String> lists2=Arrays.asList("a","b","c","d"); lists2.forEach(i-> System.out.println(i)); //1.不必定须要顺序处理List中的元素,顺序能够不肯定 //2.能够并行处理,充分利用多核CPU的优点 //3.有利于JIT编译器对代码进行优化
lambda表达式能够分解成三部分来看: (1)参数列表 (2)-> (3)lambda体,闭包
i -> System.out.println(i))并发
左边是参数列表,lambda能够接收任意多个参数,当参数数量大于1时,须要将参数括起来,如 app
(i,j)->System.out.println(i+j))函数
若是不须要指定参数,须要使用()来表示无参,如性能
()->System.out.println("hello lambda")学习
能够看到咱们并无声明参数的数据类型,这是由于不少状况下,编译器能从上下文中推导出数据的参数类型,固然咱们能够显示的指定类型优化
(int i,int j)->System.out.println(i+j))
函数箭头的右侧是lambda体,上面的例子中只有一行代码,当有多行代码时,须要使用{}括起来,如
(i,j) ->{System.out.println(i);System.out.println("----"); }
若是lambda体中的表达式有返回值,须要使用return来返回,也能够后面跟一个参数来停止lambda体,
(i,j)->return i+j 或 (i,j)->i+j;
函数式接口:
理解函数式接口,是学习lambda表达式的关键,函数式接口的定义其实比较简单,对于任意一个接口(interface),若是他只包含一个(抽象)方法,那么这个接口就能够称之为函数式接口,这种接口被@FunctionalInterface注解标示。引入了一个新的包java.util.function,这个包中定义了不少函数式接口用于支持lambda表达式。
@FunctionalInterface public interface Function<T, R> { R apply(T t); } public static int changeTheValue(int value ,Function<Integer,Integer> function){ return function.apply(value); } @Test public void testChangeTheValue(){ int value=10; int result1=changeTheValue(value,i->i+5); System.out.println("result1:"+result1); int result2=changeTheValue(value,(i)->i*30); System.out.println("result2"+result2); }
总结优势:简洁,并发更有优点。
缺点:不在并发状况使用,有时候会下降性能,不易于调试。
认识还比较浅,毕竟使用的少,之后会随着本身的认识加深补充修改。
补充知识点 Streamapi 和 lambda 配合使用