Lambda 简介
近年来,由于函数编程语言快速发展,让开发者愈发的感觉到编程的快感,但Java 这个拥有20年历史的编程语言霸主,就显的非常的笨重。
为了能根据时代发展,java 8中引入了lambda表达式。促进了java的函数编程,大大提升了开发效率。
lambda表达式的出现,改变了Java开发者的编程习惯,但lambda应该如何更好的使用呢? effective java 中给出了说明。
Lambda 优于于匿名类
有参匿名类
下面的实例是按照数字的升序排列代码片段。使用了匿名类创建了排序的比较函数。
使用匿名内部类满足了面向对象的设计模式对函数对象的需要,Comparator接口排序方式使用了抽象策略,匿名类则是实现数字排序的具体策略。但这种方式过于繁琐,增加了开发者困难。
在Java 8中出现了函数接口的概念。
只有一个抽象方法的接口称为函数接口,可以用@FunctionalInterface注解标识,java 8 中可以使用Lambda 表达式的方式隐形的创建接口实例。上面的排序代码使用Lambda后
Collections.sort(numbers, (a, b) -> a.compareTo(b));
注意,为了简洁可以删除所有Lambda参数类型,除非是遇到编译器无法推导出类型时。
使用Lambda表达式替代比较器构造方法,代码片段如下
Collections.sort(numbers, Comparator.comparingInt(Integer::intValue));
Integer 中提供了比较器compareTo()函数
Collections.sort(numbers, Integer::compareTo);
Java 8 在List接口中添加了sort函数,代码可以更加简洁
numbers.sort(Integer::compareTo);
无参匿名类
下面是启动一个线程的代码片段。
使用Lambda式后,代码片段
1.new Thread(() -> {
2. //TODO code
3. });
在无参时,通过()标识。
总结
无论是有参匿名类,还是无参匿名类都可以使用Lambda表达式,使用Lambda表达式可以做到与匿名类一样的效果,而且还更加简洁。在匿名类,省略方法名称上,还可以省略参数类型。这是java 8 编译器类型推导的功劳。
注意,我们上面写的是Lambda优于匿名类,而不是完全替代匿名类。Lambda限于函数接口。如果创建的是抽象类实例,那就需要使用匿名类完成,Lambda无法实现。匿名类可以为带有多个抽象方法的接口创建实例,而Lambda只能为一个。在Lambda中,this是外部实例,而匿名类中,则是指匿名类本身的实例。
方法引用优于Lambda
与匿名类对比,Lambda方式主要优势在于更加简洁。Java 8 提供了比Lambda更加简洁函数对象的方法:方法引用.
方法引用是用来直接访问类或者实例已经存在的方法或者构造方法。
方法引用类型
方法引用:对象引用::实例方法名;类名::静态方法名;类名::实例方法名
构造器引用: 类名::new(类构造器);类型[]::new(数组构造器)
对象引用,下面代码片段是获取当前纳秒时间值
1.Instant instant = Instant.now();
2.Supplier supplier= instant::getNano;
同样代码改用Lambda表达式
Supplier supplier =()->instant.getNano();
可以看出使用方法引用更加简洁。
静态方法名引用,下面代码是数字进行开方计算。
Function sqrt = Math::sqrt
同样代码改用Lambda表达式
Function sqrt = (a)->Math.sqrt(a);
实例方法名引用:计算字符串的长度
Function b = String::length;
同样代码改用Lambda表达式
Function l = (a) -> a.length();
类构造器:创建一个TreeMap
1.Supplier> treeMap = TreeMap::new;
Lambda方式
Supplier> lambda = ()->new TreeMap();
数组构造器:构造一个Integer 数组
1.Function array = Integer[]::new;
Lambda方式
2.2.Function lambda = (length) -> new Integer[length];
总结
在方法引用中,当方法名过长时也可能出现,方法引用比Lambda方式更加复杂情况。我们在使用过程中,只有方法引用更加简洁,易懂,就使用方法引用;如果方法引用并不简洁,就使用Lambda方式。
领取专属 10元无门槛券
私享最新 技术干货