Java核心技术整理(七)---Lambda表达式

2022-01-13 14:00:29 浏览数 (1)

1、lambda表达式

Java8新特征Lambda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类。lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

具体特征:

可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

λ表达式本质上是一个匿名方法。让我们来看下面这个例子:

代码语言:javascript复制
public int add(int x, int y) {
    return x   y;
}

转成λ表达式后是这个样子:

代码语言:javascript复制
(int x, int y) -> x   y;

参数类型也可以省略,Java编译器会根据上下文推断出来:

代码语言:javascript复制
(x, y) -> x   y; //返回两数之和

或者

代码语言:javascript复制
(x, y) -> { return x   y; } //显式指明返回值

可见λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。

优点:

1、代码简洁,开发快速。

函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。Paul Graham在《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。“当然,这样的对比故意夸大了差异,但是"在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。”

2 . 接近自然语言,易于理解

函数式编程的自由度很高,可以写出很接近自然语言的代码。以java为例把学生以性别分组:

没用labmda表达式:

用了lambda表达式:

3. 更方便的代码管理

函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

4 . 易于"并发编程"

函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。

5 . 代码的热升级

函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。

缺点:

1、函数式编程常被认为严重耗费在CPU和存储器资源。

主因有二:

(1)早期的函数式编程语言实现时并无考虑过效率问题。

(2)有些非函数式编程语言为求提升速度,不提供自动边界检查或自动垃圾回收等功能。惰性求值亦为语言如Haskell增加了额外的管理工作。

2、语言学习曲线陡峭,难度高

函数式语言对开发者的要求比较高,学习曲线比较陡,而且很容易因为其灵活的语法控制不好程序的结构。

0 人点赞