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

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

Collections.sort(a, new Comparator() {
    @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() {
    @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() {
    @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);
        }
    }
});

正文完。

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

你可能感兴趣的:(java)