首页 > java > jdk8 > 3.Java兰姆达(Lambda)表达式

3.Java兰姆达(Lambda)表达式

javaJDK8.0开始引入了Lambda表达式,同时也是引入了一种新的编程思想-函数式编程(Functional Programming).Lambda表达式是函数式编程(Functional Programming)的基础.

1 什么是Lambda表达式

Lambda表达式(lambda expression)是JDK8新增语法特性之一, Lambda表达式一个匿名函数,Lambda表达式基于数学中的λ演算得名.编程中提到的lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.如果接口只有一个方法,这时使用匿名内部类时代码看上去不清晰也不简洁.在这种情况下,你会希望将函数(functionality)作为参数传递进去,来让代码看起来更加简洁.Lambda表达式可以实现这种需求,将函数作为方法参数,者将代码作为数据.可以将单方法(single-method)接口更加简洁.

举个栗子

Comparable接口中只有一个方法compareTo.

/**
 * 大屎蛋教程网 http://dashidan.com
 */
public interface Comparable<T> {
    public int compareTo(T o);
}
在Java lambda的设计过程中,有一段时间是说所有的SAM(Single Abstract Method)类型(包括只有一个抽象方法的接口以及只有一个抽象方法的抽象类)都可以当作lambda表达式的目标类型,但后面真正的规范把设计收紧了,只支持单抽象方法的接口才算数.

2 命令式编程(Imperative Programming)

所有的命令式语言都被设计来高效地使用冯诺依曼体系结构的计算机.最初的命令式语言的目的就是取代汇编语言,对机器命令进行进一步抽象.因此,命令式语言带有强烈的硬件结构特征.命令式语言的核心特性有:模拟存储单元的变量、基于传输操作的赋值语句,以及迭代形式的循环运算.命令式语言的基础是语句(特别是赋值),它们通过修改存储器的值而产生副作用(side effect)的方式去影响后续的计算.

举个栗子

在Java的典型的for循环中,通过修改变量i的值,来控制循环逻辑的执行.

/**
 * 大屎蛋教程网 http://dashidan.com
 */
for(int i = 0; i < 10; i++) {
    ...
}
在JDK8之前,Java没有引入Lambda之前可以说是个典型的命令式语言.在JDK8引入了Lambda表达式后,也随之引入了函数式编程的概念.

3 函数式编程(Functional Programming)

这种能够接受一个函数作为参数的函数叫做"高阶函数"(higher-order function),是来自函数式编程(functional programming)的思想.函数式编程将电脑运算视为函数的计算.函数式语言设计的基础是Lambda表达式,函数式语言进行计算的主要是将函数作用与给定参数之上.函数式语言没有命令式语言所必需的那种变量,可以没有赋值语句,也可以没有循环.一个程序就是函数定义和函数应用的说明,一个程序的执行就是对函数应用的求值.

4 Java为什么会引入Lambda表达式

之所以产生如Lambda表达式等这些新特性,背后的驱动力是硬件的多核化发展趋势.在此趋势下,芯片设计者只能采用多核并行的设计思路,而软件开发者必须能够更好地利用底层硬件的并发特性.Lambda表达式是函数式编程的基础,已经广泛的在其他语言中应用,比如 Groovy,Ruby,Python等.Java中的Lambda表达式和其他语言有所不同,在Java中Lambda是基于SAM(single abstract method)单方法接口实现.

函数式编程对于Java语言来说是一个全新的视角,也是一种技术发展的趋势.在大数据发展越来越迅猛的时代,这个是Java跟随时代的需要做的必要改进.

5 java Lambda表达式的优点

  • 更加紧凑的代码

比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长,可以通过Lambda表达式来降低代码量.

  • 更好地支持多核处理

通过Java 8新增的Lambda表达式,可以很方便地并行操作大集合,充分发挥多核CPU的潜能.并行处理函数如filter、map和reduce.

  • 使集合操作得到了改善

JDK8引入stream API.将大数据处理常用的map、reduce、filter这样的基本函数式编程的概念与Java集合结合起来.随之而来的是map、reduce、filter等操作都可以并行化,更加适合大数据的并行处理.

6 参考文章

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

https://www.developer.com/java/start-using-java-lambda-expressions.html

转载请保留原文链接.