通过lambda表达式来实现 通过对象的某一个属性来排序
对象的排序一般会用到Comparator 接口,假设有如下一个类
class a { private int x; private int y; }
很简单的一个类 a 里面有两个属性 x 和 y
List<a> as = new ArrayList<a>();
我们如何对as 里面的对象集合 跟据 a 中的某个属性来 进行排序呢 ,首先要构造一个比较器
Comparator<a> byx = new Comparator<a>(){ public int compare(a a1, a a2){ return Double.compare(a1.getX(),a2.getX());
} };
利用lambada 表达式来简化一下:
Comparator<a> byx = (a1,a2)->Double.compare(a1.getX(),a2.getX());
是不是已经很简化了呢?
想像一下,就会发现比较死板,因为这个比较接口只能根据 x 进行排序,如果根据y 就要去改动很麻烦。
好吧 我们继续改进 利用拆分的方法,如果想灵活的根据类里所有属性 来排序
首先关键字抽取函数的函数接口:p-> getX(); 利用接口java.util.function
Function <a,Double> key = p->p.getX();
在进行组合
Comparator<a> abyx = (a1,a2)->key.apply(a1).compareTo(key.apply(a2));
最后构建一个通用排序接口
public static <T,U extends Comparable<U>> Comparator<T>comparing(Function<T,U> key){ return (c1,c2) -> key.apply(c1).compareTo(key.apply(c2)); }
as..Stream().map(????).sorted(comparing(p->p.getY()));

浙公网安备 33010602011771号