一、lambda表达式
1、lambda是什么
“Lambda 表达式”(lambda expression)是Java 8 添加的一个新特性,是一个匿名函数(即没有函数名的函数),基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction)。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。lambda表达式代替的函数既没有方法名也没有访问修饰符、明确的返回类型声明(相似于匿名内部类)。作用是返回一个实现了接口的对象。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。将一个变量传入一个匿名函数然后对传入函数进行操作。由于java中并没有脱离类而存在的函数,所以通常独立函数是以一个匿名内部类+一个方法构成的。
2、为什么使用Lambada表达式?
使用Lambda表达式对比于其他接口实现方式显得非常简洁。
3、Lambda对接口的要求?
虽然Lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以使用Lambda表达式来实现,要求接口种定义的必须要实现的抽象方法只能是一个(具体方法可以多个或者没有)。
4、基本语法注意事项
(1)关注重点:参数列表 方法体
(2)小括号():用来描述一个参数列表(形参)
(3)大括号{}:来描述一个方法体
(4)->:即Lambda运算符,读作goes to ,用于分割参数列表和方法体
5、lambda表达式的优缺点
优点:
(1)代码更加简洁,效率高。
(2)非常容易并行计算。
(3)可能代表未来的编程趋势。
(4)结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。
(5)减少匿名内部类的创建,节省资源。
(6)所有的 for 循环都能被 lambda 表达式改写。
缺点:
(1)若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)。
(2)不容易调试。
(3)若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。
(4)在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt。
(5)虽然代码更加简洁,但可读性差,不利于维护。
二、方法引用
1、什么是方法引用
方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与Lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。可以快速将一个Lambda表达式的实现指向一个已经写好的方法。
2、语法
方法的隶属者(隶属者不是接口,而是定义引用方法的类或者对象),静态方法隶属者为类,非静态方法的隶属者是对象(即:“方法的隶属者:方法名”)。
3、注意事项:
(1)被引用的方法的参数数量以及类型一定要和接口中的方法参数数目一致。
(2)被引用的方法的返回值一定要和接口中的方法返回值一致。方法引用这个整体表达式可以返回函数式接口的实现对象,但其调用或引用的方法其返回类型绝不是接口实例对象。
(3)方法名的后面没有括号“()”。
(4)方法的引用是可以有多个参数入口的,虽然再::表达式中没有体现(由于没有小括号),但是接口中对其已有所规定了。
4、进行方法引用在Java中提供了四种形式:
(1)引用静态方法:类名称::static方法名称;
(2)引用某个实例对象的方法:实例化对象::普通方法;
(3)引用特定类型的方法:特定类::普通方法;
(4)引用构造方法:类名称::new;
三、总结
Lambda表达式和方法引用的目的都是使用具体的方法来代替接口中抽象的方法,但是在实际使用中,调用的是接口中被实现的方法名,lambda表达式和方法引用只应用于接口实例的方式实现了的构造过程。



