Java8_Lambda学习(1)——关于Comparator接口

前言(吐槽自己,正文在下):其实一开始只是简单看了看lambda,知道有,能写个hello world级别的例子而已。本着现在开始总比不看好的原则,学习一波。。 —————————————————————分割线———————————————————— 依旧菜鸟风格,Lambda详情等不作描述。 在习惯匿名类的用法后,直接看Lambda其实有点看不懂。

Collections.sort(a, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});

对于一开始就是接触匿名类的人来说,上面这个匿名类其实很明白的说明了传入的对象(Comparator),接口对象需要覆盖调用的方法,以及这个方法需要的参数和内部操作。

Collections.sort(a, (o1, o2) -> o2 - o1);

而这个Lambda的写法就有点抽象了,因为他都是编译器(不知道有没有说错)自己推断出的类型。 跳过Lambda。。。(发现自己说不明白) 说重点Comparator中的compare方法吧!!! 他是用于排序(不仅限于排序)的方法。 根据文档说明,返回值 INT有三种状态,负整数、零或正整数。 当我一开始重写这个方法的时候,想的和平时的比较一样,以为会返回一个我需要排序的对象。 于是变成了:

@Override
public int compare(Integer o1, Integer o2) {
    return Math.max(o1, o2);
}

很成功的没有对需要排序的对象作任何处理。 然后才去看了文档以及上网查。 发现并没有对这个方法的返回值状态对排序的结果作解释(可能是太简单 OR 我搜的不多)

Collections.sort(a, (o1, o2) -> o2 - o1);
//[7, 6, 5, 4, 3, 1]
Collections.sort(a, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});
//[1, 3, 4, 5, 6, 7]

再贴一遍代码。可以看到这两个的排序结果是不一样的。 给人一种直观的感受就是后一个参数放前面就是降序——o2-o1 而前一个参数放前面就是升序——o1-o2 但是我觉得不能这么理解有问题,很浅显。虽然我也不明白为什么决定浅显。

于是我把这两个参数o1,o2看成一个一维数组 当返回值为负整数时,选o1 当返回值为正整数时,选o2 零如果没有特意处理不做比较。

升序时,即o1 - o2 大于0 : o1大,大于零选o2嘛,小的o2在前面了。 小于0 : o2大,小于零选o1嘛,小的o1在前面了。 降序时,即o2 - o1 大于0 : o2大,选o2 小于0 : o1大,选o1

说的这么复杂好像没什么用。 其实直接点就是 前-后:升序 后-前:降序 零需要额外处理,即需要一个第二判断依据。 如

Collections.sort(a, new Comparator<Ds>() {
    @Override
    public int compare(Ds o1, Ds o2) {
        if (o1.i != o2.i) {
            return o1.i - o2.i;
        } else {
            return o1.s.compareTo(o2.s);
        }
    }
});

正文完。

感谢观众看到最后 撒花~~~ 其实写的并不好,因为好像写点基本没有…… 诶。。。

经验分享 程序员 微信小程序 职场和发展