一、函数式编程
说起 Lambda 就不得不说这样的一个概念:函数式编程
函数式编程是一种思想,是一个大的概念。
对于函数式编程,有个比较浅显易懂的定义是这样的:
在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值
也就是说,在Java代码中,我们可以把一个函数作为参数进行传递,而不是在方法中对函数进行调用了~
在写回调函数与实践处理程序时,使用函数式编程可以使Java程序员不再纠缠于匿名内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单。
二、Lambda 相关
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。——百度百科
在社区中,很多人说 Lambda 表达式不过是 Java 的语法糖,我认为这句话是有失偏驳的。这是语法糖么?是语法糖么?是!~(嘿嘿嘿)~
尽管 Lambda 是 Java 8 的语法糖,但是由于 Lambda 表达式的引入,Java 代码可以更加的优美,可以使原本用于匿名内部类的代码更加简介和易读。
下面,我们来看一个 Lambda 表达式的一个简单的例子
//这句代码很容易理解:在 BinaryOperator 中创建一个返回类型为 Long 的方法,方法名为 addExplicit,方法的内容为传入两个 Long 类型的参数进行求和,并将其值返回
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y ;
这是一种显示声明 目标类型 参数类型的 Lambda 表达式写法
目标类型是指 Lambda 表达式所在上下文环境的类型。比如,将 Lambda 表达式赋值给一个局部变量或传递给一个方法作为参数,局部变量或者方法参数的类型就是 Lambda 表达式的目标类型。
在有些情况下,Lambda 表达式中可以不显示声明目标类型,而是依赖于上下文环境,由编译器推断出来。如
//上面代码的另一种写法
BinaryOperator<Long> addExplicit = (x, y) -> x + y;
在使用匿名内部类的时候,一定会遇到这样的情况:引用方法里的变量。这时,变量需要声明为final。否则,会提示报错
// 伪代码举例,相应方法未定义
public class UserTest {
final String name = "Lee";
public void