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

本文从作者个人学习Lambda表达式的经历出发,对比了Lambda与匿名类的使用方式,并深入探讨了Comparator接口中的compare方法如何实现升序与降序排序。通过具体的代码示例,帮助读者更好地理解Lambda表达式的应用及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);
        }
    }
});

正文完。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值