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))
这就是最终的解决方案!!!
1156

被折叠的 条评论
为什么被折叠?



