技术交流qq群: 659201069
lambda表达式是java8新增的一个语法元素,也是java8最重要新特性,增加lambda新特性是java语言持续保持活力和创新性的必然要求,因为lambda表达式是近几年计算机语言设计的重点关注领域,包括随spark而火起来的scala语言,也就是以对lambda表达式支持而备受欢迎。可以说lambda表达式是继java5提供泛型编程后,又一次重塑和飞跃。java实现的lambda表达式与scala略有不同,本文只介绍java8中lamda表达式的应用。
记住重要的一点:我们知道一个接口必须有一个子类来实现其所有方法才能使用。lambda表式的作用就是当把lambda表达式(即匿名函数)赋值给一个函数式接口的引用时,自动创建了该接口的匿名的实现类。看完下面的例子就明白了
java8中的lambda表达式和函数式接口密切相关。下面分别介绍下lambda表达式自身的定义和函数式接口的定义,然后再结合具体例子就不难理解lambda表达式和应用了。
**lambda表达式:**lambda表达式本质上就是个匿名方法,但此方法不能单独执行,而要赋给一个函数式接口。lambda表达式的语法很简单,也比较单一,看下面的例子
//无参数形式,其实就是一个函数,返回值就是100
() -> 100
//带参数参数形式(和普通函数一个可以有多个参数,参数类型可以不用指定,java会根据函数式接口的抽像方法自己推断出来)
(int n) -> n%10 //可以这样简写(n) -> n%2
//带多个参数
(n,m,l) -> n+m+l //也可以这样简写(int n,int m,int l) -> n+m+l
//lambda块
(n) -> {
int sum = 0;
for(int i=0;i<n;i++){
sum +=i;
}
return sum;
};
函数式接口:只包括一个抽像方法的接口就是函数式接口,我们知道在java8之前接口所有的方法都是抽像方法,但java8提供了默认实现的方式,说的简单点函数式接口可以有多个方法,但只能有一个方法没有方法体。看下面的例子就很容易明白了
//java自带的run接口就是函数式接口,此处@FunctionalInterface注解的用处是帮助开发工具进行语法检查,指明此接口是一个函
//数式接口,如果接口的定义不符合函数式接口的定义就会提示错误
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* t