Lambda表达式
1.什么是lambda表达式
lambda表达式,也可称为闭包
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)
Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例,必须是函数式接口类型
使用Lambda表达式可以使代码变的更加简洁紧凑,简化创建匿名内部类对象
1.1优点
(1)简洁
(2)非常容易并行计算
(3)可能代表未来的编程趋势
(4)结合hashmap的computeIfAbsent方法,递归运算非常快。java有针对递归的专门优化。
1.2缺点
(1)若不用并行计算,很多时候计算速度没有比传统的for循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对Collection类型支持的好,对其他类型支持的一般)
(2)不容易调试
(3)代码不容易让其他语言的程序员看懂
(4)在lambda语句中强制类型转换貌似不方便,一定要搞清楚到底是map还是mapToDouble还是mapToInt
2.Lambda表达式的语法
(1)lambda表达式的本质是一个匿名方法,但如果有一个方法的签名(参数列表和返回值)和functional interface的 签名一样并且逻辑正好是你需要的,那么你可以使用方法引用的方式来将它赋值给你的functional interface,而无 需再编写lambda表达式.
(2) 方法引用是jdk1.8中被引入的新语法,它跟lambda表达式息息相关,从字面意思来看,方法引用指向一个方法, 但不调用它。其实这个特性在很多编程语言中都已经支持了,java也终于支持了。像其它编程语言一样,加括号就 是调用方法,不加括号就是引用方法。
(parameters) -> expression
(parameters) ->{ statements; }
3.lambda表达式的重要特征
3.1 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值 ;
3.2 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号
接收一个参数(数字类型),返回其2倍的值 x -> 2 * x
接受2个参数(数字),并返回他们的差值 (x, y) -> x – y
3.3 可选的大括号:如果主体包含了一个语句,就不需要使用大括号 ;
3.4可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回 了一个数值。
4.基本用法
Java8新增了一个操作符->,称为lambda操作符或箭头操作符,它将lambda表达式分为两部分,箭头之前的是参 数,箭头之后的是动作。
定义函数式接口
在java中,lambda表达式一定要结合functional interface来使用,functional interface是指一个只包含一个抽象 方法的接口。
public interface MyInterface {
int doSomething(int number);
}
MyInterface myInterface = n -> n + 1;
int number = myInterface.doSomething(5);
5.lambda表达式限制
(1)目标类型必须是明确的函数式接口
(2)只能为函数式接口创建对象