Lambda和方法引用实战

Lambda和方法引用实战

用不同的排序策略给一个Apple列表排序,并展示如何把一个原始粗暴的解决方案转变得更为简明。最终实现的解决方案为:inventory.sort(comparing(Apple::getWeight));

1. 传递代码

首先找到List类的排序方法sort方法,签名如下:

void sort(Comparator<? super E> c)

sort方法需要一个Comparator对象来比较两个Apple,这就是传递策略的方式:它们必须包裹在一个对象里。这里称为sort的行为被参数化了:传递的排序策略不同,其行为也会不同。

第一个解决方案如下代码:

public class AppleComparator implements Comparator<Apple> {
	public int compare(Apple a1, Apple a2) {
		return a1.getWeight().compareTo(a2.getWeight());
	}
}

inventory.sort(new AppleComparator());

2. 使用匿名类

不创建新类继承Comparator类,直接在传参的时候使用匿名类实例化对象,代码如下:

inventory.sort(new Comparator<Apple>() {
	public int compare(Apple a1, Apple a2) {
		return a1.getWeight().compareTo(a2.getWeight());
	} 
})

3. 使用Lambda表达式

Comparator的签名为 (T, T) -> int,将T与Apple绑定,此时不显示声明Lambda具体实现的接口为Comparator,直接实现其抽象方法,代码如下:

inventory.sort(
				(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
			  );

此时如果不显示声明Lambda的参数类型,可进一步简化代码,代码如下:

inventory.sort(
				(a1, a2) -> a1.getWeight().compareTo(a2.getWeight())
			  );

为使代码变得更简洁,引入Comparator类中一个叫做comparing的静态辅助方法,该方法可以接收一个Function(T->R)来提起Comparable键值,并生成一个Comparator对象。代码如下:

Comparator<Apple> c = Comparator.compring((Apple a) -> a.getWeight());
inventory.sort(c);

直接将Lambda表达式传入compring方法,并省去参数类型,代码如下:

inventory.sort(comparing(a -> a.getWeight()));

4. 使用方法引用

使用方法引用的第二种方法(引用参数方法,a作为Lambda的参数,且函数主体调用的方法为a的getWeight方法),代码如下:

inventory.sort(comparing(Apple::getWeight))

这就是最终的解决方案!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值