Effective java-Lambda使用

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方式。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191112A03YS700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励