通过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()));

 

posted @ 2015-12-08 16:45  神码都在云端  阅读(2008)  评论(0)    收藏  举报